Сложение длинных целых чисел используя двусвязные списки - 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.
  2. Тип данных mas представляет собой указатель на структуру tmas.
  3. Структура tmas содержит поля a (целое число от 0 до 9), p и n (указатели на другие элементы списка).
  4. Переменные a, a1 и a2 представляют собой ссылки на первый элемент списка.
  5. Функция DisposeMT освобождает память, используя цикл while для прохода по списку и вызова функции Dispose для каждого элемента.
  6. Функция GetLongNumSt принимает строку и создает список, содержащий числовые значения каждого символа строки.
  7. Функция GetLongNumInt принимает длинное целое число и создает список, содержащий отдельные цифры этого числа.
  8. Функция LongNumInSt принимает список и строку и добавляет символы чисел из списка в строку.
  9. Функция ShowLongNum принимает список и выводит его на консоль.
  10. Функция LongSum принимает три списка и объединяет их в один список, выполняя сложение отдельных цифр.
  11. В основной части программы создаются списки a1 и a2, содержащие числа из строки и числа из длинного целого числа соответственно.
  12. Затем списки выводятся на консоль, сумма их элементов сохраняется в списке a, которая затем также выводится на консоль.
  13. Наконец, память, выделенная для списков, освобождается с помощью функции DisposeMT.

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


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

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

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