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

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

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

Код к задаче: «Сложение длинных положительных целых чисел, используя циклические списки - 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.

11   голосов, оценка 4.364 из 5


СОХРАНИТЬ ССЫЛКУ