Сложение длинных положительных целых чисел, используя циклические списки - 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.
Объяснение кода листинга программы
- Объявлены типы данных: 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 для хранения суммы чисел.
- В процедуре DisposeMT(var mm : mas) происходит освобождение памяти, занятой элементами списка, используя цикл, пока mm не станет равным nil.
- В процедуре GetLongNumSt(S : String; var m : mas) создается список из символов строки S, при этом каждый символ преобразуется в его числовое значение в диапазоне от 0 до 9.
- В процедуре GetLongNumInt(SL : Longint; var m : mas) создается список из разрядов числа SL, начиная с наиболее значимого.
- В процедуре LongNumInSt(m : mas; var S : String) список m преобразуется в строку, используя функцию Chr для преобразования числовых значений в соответствующие символы.
- В процедуре ShowLongNum(m : mas) выводится на экран содержимое списка m.
- В процедуре LongSum(m1,m2 : mas; var m : mas) происходит сложение двух списков m1 и m2, при этом результат записывается в список m. При суммировании разрядов чисел происходит проверка на переполнение и корректность получаемого числа.
- В основной части программы создаются списки a1, a2 и a, заполняются данными, выводится их содержимое, затем происходит сложение a1 и a2, и выводится результат. После выполнения всех операций списки освобождаются от памяти.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д