Подпрограмма сложения длинных чисел

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;


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: