Сложение длинных положительных целых чисел, используя циклические списки - PascalABC.NET

Узнай цену своей работы

Формулировка задачи:

как реализовать программу сложения длинных целых чисел используя циклические списки?

Решение задачи: «Сложение длинных положительных целых чисел, используя циклические списки»

textual
Листинг программы
Type
  cif = 0..9;
  mas = ^tmas;
  tmas = Record
           a : Cif;
           p,n : mas;
         End;
 
Var
  a,a1,a2 : mas;
 
Procedure DisposeMT(var mm : mas);
Var mt : mas;
Begin
  If mm<>nil then
  Repeat
    mt:=mm;
    mm:=mm^.n;
    Dispose(mt);
  Until mm=nil;
End;
 
Procedure GetLongNumSt(S : String; var m : mas);
Var
  i  : Integer;
  mt : mas;
Begin
  m:=nil;
  For i:=1 to Length(S) do
  Begin
    New(mt);
    mt^.a:=Ord(S[i])-Ord('0');
    mt^.p:=nil;
    mt^.n:=m;
    If m<>nil then m^.p:=mt;
    m:=mt;
  End;
End;
 
Procedure GetLongNumInt(SL : Longint; var m : mas);
Var
  L : Longint;
  mt : mas;
Begin
  L:=SL; m:=nil;
  While L>0 do
  Begin
    New(mt);
    mt^.a:=L mod 10;
    mt^.n:=nil;
    mt^.p:=m;
    If m<>nil then m^.n:=mt;
    m:=mt;
    L:=L div 10;
  End;
  While m^.p<>nil do m:=m^.p;
End;
 
Procedure LongNumInSt(m : mas; var S : String);
Var mt : mas;
Begin
  S:='';
  mt:=m;
  While mt<>nil do
  Begin
    S:=Chr(mt^.a+Ord('0'))+S;
    mt:=mt^.n;
  End;
End;
 
Procedure ShowLongNum(m : mas);
Var St : String;
Begin
  LongNumInSt(m,St);
  Writeln(St);
End;
 
Procedure LongSum(m1,m2 : mas; var m : mas);
Var
  k,n1,n2    : Byte;
  mt,m01,m02 : mas;
Begin
  k:=0; m01:=m1; m02:=m2; m:=nil;
  While (m01<>nil) or (m02<>nil) do
  Begin
    If m01<>nil then
    Begin
      n1:=m01^.a;
      m01:=m01^.n;
    end else n1:=0;
    If m02<>nil then
    Begin
      n2:=m02^.a;
      m02:=m02^.n;
    end  else n2:=0;
    
    New(mt);
    mt^.p:=m;
    mt^.n:=nil;
    If m<>nil then m^.n:=mt;
    If n1+n2+k<10 then
    Begin
      mt^.a:=n1+n2+k;
      k:=0;
    end 
    else
      Begin
        mt^.a:=(n1+n2+k) mod 10;
        k:=(n1+n2+k) div 10;
      end;
    m:=mt;
  end;
  While m^.p<>nil do m:=m^.p;
end;
 
Begin
  { == DEMO-TEST == }
  GetLongNumSt('1234567890',a1);
  GetLongNumInt(987654321,a2);   
  ShowLongNum(a1);
  ShowLongNum(a2);
  LongSum(a1,a2,a);              { a1+a2 = 2222222211 }
  ShowLongNum(a);
  { =============== }
  DisposeMT(a1);
  DisposeMT(a2);
  DisposeMT(a);
End.

Объяснение кода листинга программы

  1. Объявлены типы данных: cif - целочисленный тип от 0 до 9; mas - ссылочный тип, указывающий на голову циклического списка; tmas - запись, содержащая поля типа cif, p и n типа mas; a, a1, a2 - переменные типа mas; mt - вспомогательная переменная типа mas; i - целочисленная переменная; L - длинное целое число; S - строка; St - строка для хранения результата; k, n1, n2 - целочисленные переменные для хранения разрядов чисел; m01, m02 - временные переменные типа mas; m, mt - переменные типа mas для хранения суммы чисел.
  2. В процедуре DisposeMT(var mm : mas) происходит освобождение памяти, занятой элементами списка, используя цикл, пока mm не станет равным nil.
  3. В процедуре GetLongNumSt(S : String; var m : mas) создается список из символов строки S, при этом каждый символ преобразуется в его числовое значение в диапазоне от 0 до 9.
  4. В процедуре GetLongNumInt(SL : Longint; var m : mas) создается список из разрядов числа SL, начиная с наиболее значимого.
  5. В процедуре LongNumInSt(m : mas; var S : String) список m преобразуется в строку, используя функцию Chr для преобразования числовых значений в соответствующие символы.
  6. В процедуре ShowLongNum(m : mas) выводится на экран содержимое списка m.
  7. В процедуре LongSum(m1,m2 : mas; var m : mas) происходит сложение двух списков m1 и m2, при этом результат записывается в список m. При суммировании разрядов чисел происходит проверка на переполнение и корректность получаемого числа.
  8. В основной части программы создаются списки a1, a2 и a, заполняются данными, выводится их содержимое, затем происходит сложение a1 и a2, и выводится результат. После выполнения всех операций списки освобождаются от памяти.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.364 из 5
Похожие ответы