Длинная Арифметика. Сложение - Free Pascal (452)
Формулировка задачи:
Считываем в строку a и b, 2 числа, соответственно. Нам нужно посчитать сумму этих двух чисел.
Диапазон
0 ≤ a, b ≤ 10^10000Решение задачи: «Длинная Арифметика. Сложение»
textual
Листинг программы
{ Процедура распечатки сверхбольшого числа}
procedure WriteBigNumber(var F: text; const aNum: TBigNumber);
var i : integer;
begin
i:=CSize;
while (i>0) and not (aNum[i] in ['1'..'9']) do Dec(i);
if i=0 then Write(F, '0');
while i>0 do begin
Write(F, aNum[i]);
Dec(i);
end;
Writeln(F); Writeln(F);
end;
{ Процедура сложения сверхбольших чисел в столбик.
Результат помещается в первое число, что равносильно оператору сложения
aNum1 := aNum1 + aNum2 }
procedure AddNumbers(var aNum1, aNum2 : TBigNumber);
var i,j : integer;
n1, n2 : integer; { слагаемые цифры}
sum, ovr : integer; { сумма и перенос}
begin
ovr:=0; { в начале переполнение= 0 }
{ цикл по всем цифрам, кроме последней}
for i:=1 to CSize-1do begin
j:=i; { j используется после завершения цикла}
{ Если в текущей позиции пробел, то считаем его нулем,
а иначе символ цифры преобразуем в цифру 0..9 }
if aNum1[i]=' '
then n1:=0
else n1:=Ord(aNum1[i])-Ord('0'); { n1 = 0..9 }
if aNum2[i]=' '
then n2:=0
else n2:=Ord(aNum2[i])-Ord('0'); { n2 = 0..9 }
sum:= (n1+n2+ovr) mod 10; { сумма sum = 0..9 }
ovr:= (n1+n2+ovr) div 10; { перенос ovr = 0 или 1 }
{ Преобразуем цифру в символ цифры}
aNum1[i]:= Char(sum + Ord('0'));
end;
{ Если было переполнение, то за последней цифрой помещаем единицу}
if ovr<>0 then aNum1[j+1]:='1';
end;
Объяснение кода листинга программы
- В первой процедуре выводится на экран длинное число.
- Цикл выводит все цифры числа, кроме последней.
- Если в текущей позиции пробел, то считываем его как ноль.
- Получаем значение цифры, преобразуя символ в число от 0 до 9.
- Во второй процедуре происходит сложение двух длинных чисел.
- Цикл проходит по всем цифрам, кроме последней.
- Если в текущей позиции пробел, то считываем его как ноль.
- Получаем значение цифры, преобразуя символ в число от 0 до 9.
- Вычисляем сумму трех чисел: текущих цифр, переноса и суммы.
- Получаем перенос, деля сумму трех чисел на 10.
- Преобразуем сумму в символ цифры, добавляя ноль.
- Если было переполнение, то добавляем единицу за последней цифрой.
- Цикл завершается, когда все цифры сложены.
- Переполнение проверяется после цикла.
- Если переполнение не равно нулю, то добавляем единицу за последней цифрой.
- Результат сложения двух длинных чисел помещается в первое число.
- Результат сложения равен оператору сложения.
- Вторая процедура завершается, и результат выводится на экран.
- Выводится ноль, так как это первая цифра результата.
- Выводится результат сложения, который является первым числом.