Другие языки программирования и технологии
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. Какие строки, если в условии речь идёт о списках?
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. Какие строки, если в условии речь идёт о списках?
Берете 2 строки и с младшего разряда поразрядно складываете. Что сложного-то.
Получил сумму, что с ней дальше делать? Даже язык не указываете. . Ну как так можно вопросы задавать. . Если тебе напишут на любом языке, то ты вряд ли сможешь перекодить на тот, который тебе нужен. .
Кстати, очень удобно складывать числа через два стека! Сначало формируешь два линейных стека, по отдельности кладёшь туда цифры числа, после этого у тебя есть два стека с цифрами в обратном порядке, начинаешь формировать третий стек, складывая два числа, запоминая переходящих разряд, и вычисляешь к следующие элементы стека. . После этого получится третий стек, который дважды перевернут, то есть его можно вывести цифра за цифрой)
Кстати, очень удобно складывать числа через два стека! Сначало формируешь два линейных стека, по отдельности кладёшь туда цифры числа, после этого у тебя есть два стека с цифрами в обратном порядке, начинаешь формировать третий стек, складывая два числа, запоминая переходящих разряд, и вычисляешь к следующие элементы стека. . После этого получится третий стек, который дважды перевернут, то есть его можно вывести цифра за цифрой)
Похожие вопросы
- Паскаль. Представить натуральное число n в виде суммы трёх квадратов натуральных чисел.
- как решить через abc pascal задачу "Дано натуральное число n. Получить все простые делители этого числа"
- Дано натуральное число п. Найти знакочередующуюся сумму цифр числа n:
- Помогите написать программу Дано натуральное число n. Вычислить сумму всех k(k+1), k меняется от 1 до n.
- ПОЖАЛУЙСТА!!!!Напишите программу для вычисления суммы 10 натуральных чисел последовательностью 1+2+4+8+..в Pascal
- Требуется написать программу, которая из цифр двух натуральных чисел создает наименьшее возможное число, сохраняя при эт
- Помогите пожалуйста!Паскаль. Дано натуральное число N. Получить наименьшее число вида 2(m в степени), превосходящее N.
- Дано натуральное число n. Найти и вывести все числа в интервале от 1 до n -1, у которых произведение всех цифр совпадает
- Требуется найти минимальное натуральное число с суммой цифр 123, которое делится на 1237 кто знаетпомогите алгоритмом!
- нужна полная прога на си для задачи. найти натуральное число от1 до 10000 с максимальной суммой делителеи.