Другие языки программирования и технологии

1. Получить сумму двух длинных натуральных чисел.

Получить сумму двух длинных натуральных чисел. Каждое число представлено стеком (информационная часть элементов стека - одна цифра числа ). Результат представлен односвязным линейным списком, информационная часть его элементов аналогична информационной части элемента стека.
module N77544106;
import System, System.Console as cio;

type byte = cardinal{8};

type {ref, public} Item = record
Digit: byte;
Next: Item;
end Item;

var rnd: System.Random;

procedure Push(var S: Item; d: byte);
var P: Item;
begin
P := new Item;
P.Digit := d;
P.Next := S;
S := P;
end Push;

procedure Pop(var S: Item): byte;
var d: byte;
begin
if S # nil then
d := S.Digit;
S := S.Next;
return d;
else
return 0;
end;
end Pop;

procedure CreateStack(var S: Item);
var i, d, dmin, n: byte;
begin
dmin := 1;
n := cardinal(rnd.Next(10, 71), 8);
for i := 1 to n do
d := cardinal(rnd.Next(dmin, 10), 8);
cio.Write(d);
Push(S, d);
dmin := 0;
end;
end CreateStack;

procedure Add(var S1, S2: Item): Item;
var
L: Item;
sum: byte;
begin
L := nil;
sum := 0;
while (S1 # nil) or (S2 # nil) do
sum := sum + Pop(S1) + Pop(S2);
Push(L, sum mod 10);
sum := sum div 10;
end;
if sum # 0 then
Push(L, sum);
end;
return L;
end Add;

procedure WriteList(L: Item);
begin
while L # nil do
cio.Write(L.Digit);
L := L.Next;
end;
end WriteList;

var
Stack1, Stack2, List: Item;
i, d: byte;
begin
rnd := new System.Random;
cio.WriteLine("Первое слагаемое: ");
CreateStack(Stack1);
cio.WriteLine;
cio.WriteLine("Второе слагаемое: ");
CreateStack(Stack2);
List := Add(Stack1, Stack2);
cio.WriteLine;
cio.WriteLine("Сумма: ");
WriteList(List);
cio.ReadKey;
end N77544106.

Процедуры:
CreateStack(S) - создаёт стек случайной длины из случайных чисел (цифр) и выводит их в консоль (на экран) . S - указатель (правда, в данном языке - это на самом деле ссылка) на вершину созданного стека.
Push(S, d) - помещает на вершину стека новый элемент со значением d. Стек, как ему и положено, увеличивается на один элемент. После выполнения S указывает на новую вершину.
WriteList(L) - выводит на экран информационные поля односвязного линейного списка, начиная с головы. L - указатель на голову списка. Список не изменяется.

Функции:
Pop(S) - возвращает значение элемента на вершине стека S. После выполнения стек, естественно, сокращается на один элемент и S указывает на новую вершину.
Add(S1, S2) - складывает два длинных числа, размещённых в стеках S1 и S2, создаёт список с результатом сложения и возвращает указатель на его голову. Стеки при этом становятся нулевой длины.
Так как в условии не указана дисциплина обслуживания для списка результата, то применён общий случай однонаправленного списка. Исходя из особенностей задачи, список создаётся с хвоста и растёт в сторону головы, поэтому используется общая со стеком процедура Push.

Примечания, касаемые автоматического управления памятью и начальной инициализации создаваемых указателей, точно такие же, как и для этой программы на Обероне-2.



P.S. Для Alexey N. Какие строки, если в условии речь идёт о списках?
АЗ
Александр Злотников
51 590
Лучший ответ
Берете 2 строки и с младшего разряда поразрядно складываете. Что сложного-то.
Beibit Sakhanov
Beibit Sakhanov
34 701
Получил сумму, что с ней дальше делать? Даже язык не указываете. . Ну как так можно вопросы задавать. . Если тебе напишут на любом языке, то ты вряд ли сможешь перекодить на тот, который тебе нужен. .

Кстати, очень удобно складывать числа через два стека! Сначало формируешь два линейных стека, по отдельности кладёшь туда цифры числа, после этого у тебя есть два стека с цифрами в обратном порядке, начинаешь формировать третий стек, складывая два числа, запоминая переходящих разряд, и вычисляешь к следующие элементы стека. . После этого получится третий стек, который дважды перевернут, то есть его можно вывести цифра за цифрой)

Похожие вопросы