BIGNUM - Xử lý số nguyên lớn
Tác giả: ll931110
Ngôn ngữ: Pascal
Program BIGNUM;
Const
input = '';
output = '';
Type
arr = array[1..2000] of longint;
Var
a,b,c: arr;
k,m,n: integer;
fa: text;
ch: char;
i: integer;
Procedure init;
Var
f: text;
i: integer;
Begin
m:= 0;
n:= 0;
Assign(f, input);
Reset(f);
While not eoln(f) do
Begin
inc(m);
Read(f, ch);
a[m]:= ord(ch) - 48;
End;
For i:= 1 to m do a[2000 - m + i]:= a[i];
m:= 2001 - m;
Readln(f);
While not eoln(f) do
Begin
inc(n);
Read(f, ch);
b[n]:= ord(ch) - 48;
End;
For i:= 1 to n do b[2000 - n + i]:= b[i];
n:= 2001 - n;
Close(f);
If m > n then k:= n else k:= m;
End;
Procedure printresult(p: integer);
Var
i: integer;
Begin
For i:= p to 2000 do write(fa, c[i]);
Writeln(fa);
End;
Procedure add;
Var
i: integer;
Begin
Fillchar(c, sizeof(c), 0);
For i:= 2000 downto k do
Begin
c[i]:= c[i] + (a[i] + b[i]);
If c[i] > 9 then
Begin
inc(c[i - 1]);
c[i]:= c[i] - 10;
End;
End;
If c[k - 1] <> 0 then printresult(k - 1)
else printresult(k);
End;
Procedure subtract(x,y: arr);
Var
s,i: integer;
Begin
Fillchar(c, sizeof(c), 0);
For i:= 2000 downto k do
Begin
c[i]:= c[i] + (x[i] - y[i]);
If c[i] < 0 then
Begin
dec(c[i - 1]);
c[i]:= c[i] + 10;
End;
End;
s:= k;
While c[s] = 0 do inc(s);
printresult(s);
End;
Procedure minus;
Var
d: integer;
Begin
d:= k;
While (d <= 2000) and (a[d] = b[d]) do inc(d);
If d > 2000 then writeln(fa, 0) else
If a[d] > b[d] then subtract(a,b)
else begin
write(fa, '-');
subtract(b,a);
end;
End;
Procedure multiply;
Var
i,j,t: integer;
Begin
Fillchar(c, sizeof(c), 0);
For i:= 2000 downto m do
For j:= 2000 downto n do
Begin
t:= i + j - 2000;
c[t]:= c[t] + a[i] * b[j];
If c[t] > 9 then
Begin
c[t - 1]:= c[t - 1] + c[t] div 10;
c[t]:= c[t] mod 10;
End;
End;
t:= 1;
While c[t] = 0 do inc(t);
printresult(t);
End;
Begin
init;
Assign(fa, output);
Rewrite(fa);
add;
minus;
multiply;
Close(fa);
End.