
21.02.2009, 23:37
|
|
Постоянный
Регистрация: 15.06.2008
Сообщений: 941
Провел на форуме: 5111568
Репутация:
2399
|
|
Длинная арифметика
программа для считивания, вывода и сравнения двух длинних положительных числел
pascal:
Код:
program crypt_lab1;
uses
crt;
const
MaxDig = 1000; { максимальное количество цифр }
Osn = 10000; { основание нашей системы счисления }
type
TLong = array[0..MaxDig] of integer;
{ считивание длинного числа с файла }
procedure ReadLong(filename :string; var a:TLong);
var i :integer;
F :text;
ch :char;
begin
for i:=0 to MaxDig do a[i]:=0;
a[0]:=1;
assign(F, filename);
reset(F);
while not eof(F) do begin
read(F,ch);
for i:=a[0] downto 1 do begin
a[i+1] := a[i+1] + ( longint(a[i]) *10) div Osn;
a[i] := ( longint(a[i]) *10) mod Osn;
end;
{val(ch,temp,temp); a[1] := a[1] + temp;}
a[1] := a[1] + ord(ch) - ord('0');
if (a[a[0]+1]>0) then inc(a[0]);
end;
close(F);
end;
{ вывод длинного числа на экран из массива}
procedure WriteLong(var a :TLong);
var ls,s:string; i:integer;
begin
str( Osn div 10, ls);
write(a[a[0]]); {starwa cufra}
for i:=a[0] - 1 downto 1 do begin
str(a[i], s);
while length(s)<length(ls) do
s:='0'+s;
write(s);
end;
writeln;
end;
{ сравнения двох дл. чисел: a == b }
function Eq(a,b :TLong):boolean;
var
i:integer;
begin
Eq := false;
if ( a[0]<>b[0] ) then exit;
{ a[0] == b[0] }
for i:=1 to a[0] do
if (a[i] = b[i]) then
Eq := i = a[0];
end;
{ сравнения двох дл. чисел: a > b }
function More(a,b :TLong):boolean;
var i :integer;
begin
if ( a[0]>b[0] ) then More:=true else
More:=false;
for i:=a[0] downto 1 do
if (a[i]<>b[i]) then
begin
if (a[i]>b[i]) then More:=true else More:=false;
break;
end;
end;
{ сравнения двох дл. чисел: a > b }
function Less(a,b :TLong):boolean;
var i :integer;
begin
Less := Not(More(a, b) Or Eq(a, b))
end;
{ сравнения двох дл. чисел: a >= b }
function More_Eq(a, b : TLong) : boolean;
begin
More_Eq := More(a, b) Or Eq(a, b)
end;
{ сравнения двох дл. чисел: a <= b }
function Less_Eq(a, b : TLong) : boolean;
begin
Less_Eq := Not More(a, b)
end;
{ сложения двух длинних чисел: a + b }
procedure Sum2Long(var a,b :TLong; var c :TLong);
var i,k:integer;
begin
for i:=0 to MaxDig do { aHaJlor: }
c[i] := 0; { fillchar(c, sizeof(c), 0); }
if a[0]>b[0] then k:=a[0] else k:=b[0];
for i:=1 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+1] = 0) then c[0]:=k else c[0] := k+1;
end;
var
a,b,c :TLong;
i :integer;
begin
clrscr;
ReadLong('num1.txt',a);
ReadLong('num2.txt',b);
write('a = '); WriteLong(a);
write('b = '); WriteLong(b);
Sum2Long(a,b,c);
write('a+b = '); WriteLong(c);
writeln( 'a > b ', More(a,b) );
writeln( 'b > a ', More(b,a) );
writeln( 'c > b ', More(c,b) );
writeln( 'c > a ', More(c,a) );
readln;
end.
пример входних данных:
num1.txt: 102030405060708090
num2.txt: 11222333444455555666666777777888888899
|
|
|