>
Третя задача. Перейдемо до написання програми додавання двох "довгих додатних чисел". Початкові числа і результат зберігаємо у файлах. Назвемо процедуру додавання SumLongTwo.
Тоді програма введення двох "довгих чисел" і виведення результату їх додавання матиме вигляд:
Var A,B,C:Tlong;
Begin
Assign(Input,'Input.txt'); Reset(Input);
ReadLong(A); ReadLong(B);
Close (Input);
SumLongTwo(A,B,C);
Assign(Output,'Output.txt');
Rewrite(Output);
WriteLong(C);
Close(Output);
End.
Нехай А = 870613029451, В = 3475912100517461.
i |
А[i] |
B[i] |
C[1] |
C[2] |
C[3] |
C[4] |
1 |
9451 |
7461 |
6912 |
1 |
0 |
0 |
2 |
1302 |
51 |
6912 |
1354 |
0 |
|
3 |
8706 |
9121 |
6912 |
1354 |
7827 |
1 |
4 |
0 |
3475 |
6912 |
1354 |
7827 |
3476 |
Алгоритм імітує звичайне додавання стовпчиком, починаючи з молодших розрядів. Для простоти реалізації арифметичних операцій з "довгими числами використовується машинне представлення ззаду наперед.
Результат: C = 3476782713546912.
Процедура додавання двох "довгих чисел".
Procedure SumLongTwo(A,B:Nlong; Var C:Tlong);
Var i,k:Integer;
Begin
FillChar(C,SizeOf (C),0);
If А[0]>B[0] Then k:=A[0] Else k:=B[0];
For i:=l To k Do
Begin
C[i+1]:=(C[i]+A[i]+B[i]) Div Osn;
C[i]:=(C[i]+A[i]+B[i]) Mod Osn;
{Чи є в цих операторах помилка?}
End;
If C[k+l]=0 Then C[0]:=k Else C[0]:=k+l;
End;
Четверта задача. Реалізація операцій порівняння для "довгих чисел" (А=В, А<В, А>В, А<В, А>В).
Function Eq(A,B:TLong):Boolean;
Var i:Integer;
Begin
Eq:=False;
If А[0]<>B[0] Then Exit
Else
Begin
i:=l;
While (i<=A[0]) And (А[i]=B[i]) Do Inc(i);
Eq:=(i=A[0]+l);
End;
End;
Реалізація функції А>В така.
Function More(A,B:Tlong):Boolean;
Var i:Integer;
Begin
If А[0]<B[0] Then More:=False
Else
If А[0]>B[0] Then More:=True
Else
Begin
i:=A[0];
While (i>0) And (А[i]=B[i]) Do Dec(i);
If i=0 Then More:=False
Else
If А[i]>B[i] Then More:=True
Else
More:=False;
End;
End;
Решта функцій реалізується через функції Eq і More.
Function Less(A,B:Tlong):Boolean;{A<B}
Begin
Less:=Not(More(A,B) Or Eq(A,B));
End;
Function More_Eq(A,B:Tlong):Boolean;
Begin
More_Eq:=More(A,B) Or Eq(A,B);
End;
І, нарешті, остання функція А<В.
Function Less_Eq (А, B:Tlong) : Boolean;
Begin
Less_Eq:-Not(More(A,B)) ;
End;