Type
tmass=array [0..255] of byte;
Var
k,i,j:byte;
cod:char;
procedure AddLong;
Var
x,y,z: tmass;i,j: word; l1,l2: byte;
f,g,h:text;ch1:char; name:string[30];
pr:byte;
{процедура чтения слагаемых из файла}
procedure ReadData (Var f1:text;Var x1:tmass);
var
ch:char;
Begin
x1[0]:=0;
write('введите имя файла для чтения длинного числа');
Readln(name);
{ $I-}
assign(f1,name); reset(f1);
{$I-}
if ioresult<>0 then
Begin
write('ошибка'); exit
end
else
begin
while not eof (f1) do
begin
while not eoln (f1) do
begin
read(f1,ch); inc(x1[0]); x1[x1[0]]:=ord(ch)-ord('0');
end;
readln(f1);
end;
Close(f1); writeln;
end;
end;
{Процедура печати прочитанных слагаемых}
procedure WriteResult1 (l3: byte; x1:tmass);
Var
i:word;
begin
for i:=l3 downto 1 do
Begin
write(x1[i]);
end;
writeln;
end;
{процедура печати результата сложения}
procedure WriteResult (Var h:text);;
Var
i:word;
begin
write('введите имя файла - результата ');
readLn(name); assign(h,name); rewrite(h);
for i:=z[0] downto 1 do
Begin
write(z[i]); write(h,z[i]);
end;
Close(h);
end;
{процедура переиндексирования элементов массивов }
procedure Perevorot (l:byte;var t:tmass);
var
i,r:byte;
begin
fo r i:=1 to (l div 2) do
begin
r:=t[i]; t[i]:=t[l-i+1]; t[l-i+1]:=r;
end;
end;
{процедура дополнения нулями}
procedure Dop (l3,l4:byte; var t1:tmass);
var
i:byte;
Begin
for i:=(l3+1 ) to l4 do
t1[i]:=0; writeln; l3:=l4;
end;
{ процедура сложения}
|
|
procedure Mainadd(t,s:tmass;l:byte; var z1:tmass);
var
i:byte;
Begin
pr:=0; z1[0]:=0;
for i:=1 to L do
begin
z1[i]:=t[i]+s[i]+pr; pr:=z1[i] div 10;
z1[i]:=z1[i] mod 10; inc(z1[0]);
end;
if pr>0 then
begin
inc(l); z1[l]:=pr; inc(z1[0]);
end;
end;
{основной блок процедуры сложения}
Begin
write('******');
ReadData (f, x);
l1:=x[0];
ReadData (g,y);
l2:=y[0];
WriteResult1 (l1, x);
WriteResult1 (l2, y);
readline;
{первый элемент массива X - младшая цифра 1 слагаемого }
Perevorot(l1,x);
{первый элемент массива Y - младшая цифра 2 слагаемого}
Perevorot (l2,y);
{блок дополнения меньшего слагаемого нулями слева до
длины большего слагаемого}
if l1> l2 then
Dop(l2,l1,y)
Else
Dop (l1,l2,x);
{сложение}
WriteResult1 (l1, x);
WriteResult1 (l2, y);
readline;
Mainadd (x,y,l1,z);
{вывод результата на экран}
{вывод результата в файл}
WriteResult(z);
end;
Ядро подпрограммы вычитания длинных целых чисел
{основная процедура}
Begin
clrscr; write('******');
ReadData (f, x);
l1:=x[0];
ReadData (g,y);
l2:=y[0];
WriteResult1 (l1, x);
WriteResult1 (l2, y);
readline;
{первый элемент массива X - младшая цифра 1 слагаемого }
Perevorot(l1,x);
{первый элемент массива Y - младшая цифра 2 слагаемого}
Perevorot (l2,y);
z[0]:=0;
for i:=1 to l2 do
Begin
if x[i]>=y[i] then
begin
z[i]:=x[i]-y[i];
end
else
begin
z[i]:=x[i]+10-y[i]; x[i+1]:=x[i+1]-1;
end;
inc(z[0]);
end;
for j:=l2+1 to l1 do
begin
z[j]:=x[j]; inc(z[0]);
end;
readline; WriteResult (z);
end;
Ядро подпрограммы умножения длинных чисел
procedure MultLong;
Var
i,j,p,q:word;
Begin
p:=l1+l2;
Fillchar (z,p+1,0);
for i:=l1 downto 1 do
for j:=l2 downto 1 do
Begin
q:=p-i-j+1; z[q]:=z[q]+x[i]*y[j];
if z[q]> 9 then
Begin
z[q+1]:=z[q+1]+z[q] div 10;
z[q]:=z[q] mod 10;
end;
end;
if z[p]<> 0 then z[0]:=p
else z[0]:=p-1;
end;
_________________
Begin
clrscr;
ReadData (f, x);
l1:=x[0];
ReadData (g,y);
l2:=y[0];
WriteResult1 (l1, x);
WriteResult1 (l2, y);
MultLong;
WriteResult(z);
end;