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.

Download