Xử lí số nguyên lớn có dấu

Các bạn giúp mình chương trình cộng hai số nguyên lớn có dấu với ak
( n,m <= 32000 chữ số)
VD
inp
3 3
222
-333
out
-111
 

quanltv

Sư phụ của ADMIN
Kiểu số nguyên LongInt là khoảng biểu diễn dài nhất, dùng 4 byte để lưu trữ: từ -2147483648 đến 3147483647
Còn đề bài sử dụng đến tận 32000 chữ số có khi phải dùng đến mảng 1 chiều để lưu trữ, mà nó cũng vượt quá bộ nhớ / kiểu dữ liệu cho phép của Pascal. Không những thế còn không có tính thực tiễn, vì chả ai dùng số nguyên lớn như thế cả

Ngoài ra bạn có thể dùng kiểu số thực, lớn nhất cũng chỉ có kiểu Extended: 1.9E-4951 đến 1.1E+4932 (10 byte), cũng không biểu diễn được số như bạn cần :)
 

tengiday

Happy life
@OP: Bạn xem posts của mình trong link này
HTML:
https://vfo.vn/t/showthread.php?96739-baI-TAP-XU-LY-SO-NGUYEN-LON-MOI-NGUOI-GIUP-VOI


Kiểu số nguyên LongInt là khoảng biểu diễn dài nhất, dùng 4 byte để lưu trữ: từ -2147483648 đến 3147483647
Còn đề bài sử dụng đến tận 32000 chữ số có khi phải dùng đến mảng 1 chiều để lưu trữ, mà nó cũng vượt quá bộ nhớ / kiểu dữ liệu cho phép của Pascal. Không những thế còn không có tính thực tiễn, vì chả ai dùng số nguyên lớn như thế cả

Ngoài ra bạn có thể dùng kiểu số thực, lớn nhất cũng chỉ có kiểu Extended: 1.9E-4951 đến 1.1E+4932 (10 byte), cũng không biểu diễn được số như bạn cần :)
Số lớn được sử dụng trong mã hóa đó bạn. Lấy ví dụ là RSA. Một trong những bước của nó là sinh ra 2 số nguyên tố 64 bit, sau đó nhân lại. Ngoài ra, thật tế có thư viện hỗ trợ số có nhiều chữ số. Mấy cty lớn đều có ng` viết thư viện sẵn cho xử lý số lớn cả, ng` sử dụng chỉ việc dùng y như với native type vậy. Quan trọng là bài tập này để xem kỹ thuật lập trình thôi.
 
Sửa lần cuối:
Mình đã đọc và đã làm được các thủ tục trù và công rồi. nhưng mình chưa rõ hàm để xử lí số nguyên lơn có dấu ,và luc nào sẽ gọi lại thủ tục trù, thủ tục cộng, trừ..mong bạn chỉ giáo.có thể chi tiết đoạn co de của hai phần trên cho mình được không ak
 
Mã:
thủ tục cộng của mình

procedure doc;
var
    x:char; I,J,so,code:integer;
begin
     assign(f,fi);reset(f);
     readln(f,n,m);
     for i:=1 to MAX do begin a[i]:=0;b[i]:=0;end;
     j:=n;
    for i:=1 to n do
     begin
     read(f,x);
     val(x,so,code);
     a[j]:=a[j]+so;
     j:=j-1;
     end;
     readln(f);
     j:=m;
     for i:=1 to m do
     begin
     read(f,x);
     val(x,so,code);
     b[j]:=b[j]+so;
     j:=j-1;
     end;
     if m>n then d:=m else d:=n;
     close(f);
end;
procedure xl;
var i:INTEGER;
    S,V:BYTE;
begin
     s:=0;
     v:=0;
     for i:=1 to D+1 do
     begin
     s:=a[i]+b[i]+v;
     b[i]:=0;
     b[i]:=s mod 10;
     v:=s div 10;
     end;
end;
procedure xuat;
var i,dem:integer;
begin
     assign(f,fo);rewrite(f);
     DEM:=0;
     for i:=D+1 downto 1 do if b[i]<>0 then begin dem:=i;break;end;
     writeln(f,DEM);
     for i:=dem downto 1 do write(f,b[i]);
 
     close(f);
end;
BEGIN
     SINH;
     doc;
     xl;
     xuat;
 
thủ tục trừ của mình
Mã:
const fi ='hieu.inp';
      fo ='hieu.out';
       max= 32001;
 type mmc = array[0..max] of byte;
 var m,n: integer;
 a,b:mmc;
   procedure nhap;
     var code, t, j, i: integer;
          f: text;
             x: char;
   begin
     assign(f,fi);
     reset(f);
     readln(f,m,n);
         for i:= 1 to max do
           begin
              a[i]:= 0; b[i]:= 0;
              end;
                  j:=m;
             for i:= 1 to m do
               begin
                    read(f,x);
                    val(x,t,code);
                       a[j]:=a[j]+t;
                     dec(j);
                     end;
                     readln(f);
                      j:=n;
                       for i:= 1 to n do
                         begin
                           read(f,x);
                             val(x,t,code);
                             b[j]:= b[j]+t;
                             dec(j);
                           end;
       close(f) ;
      end;
 function SOSANH(VAR m: integer; VAR a:mmc;VAR n: integer;var b:mmc ) : integer;
 var i : integer;
begin
    if (m > n) then exit;  SOSANH:=-1;
    if (m < n) then  exit ; SOSANH:= 1;
    for i := n downto 1 do
        begin
            if (a[i] > b[i]) then exit;  SOSANH:=-1;
            if (a[i] < b[i]) then exit; SOSANH:=1;
        end;
      exit;
     SOSANH:=0;
end;
   procedure tru(VAR a:mmc; VAR m: integer; VAR b: mmc ;VAR n: integer);
     var i,j: integer;
        nho:byte;
       begin


       nho:= 0;
        j:=1;
            for i:= 1 to m do
             begin
                if a[i] >= b[i] then
                  begin
                  a[i]:= a[i] -b[i] - nho;
                 nho:=0;
                 end else begin
                   a[i]:= a[i]+10 - b[i] -nho;
                   nho:=1 ;
                   end;
                        if a[i]> 0  then
                        j:=i;
                   end;
                    m:=j ;
            end;
 procedure xuat;
     var f: text;
         i: integer;
         t:integer;
         begin
          assign(f,fo);
           rewrite(f);
            t:=sosanh(m,a,n,b);
              if (t>0) then
                begin
                  tru(a,m,b,n);
                      for i:= m downto 1 do
                         write(f,a[i]);
                     end else
                     if (t<0 ) then
                      begin
                         tru(b,n,a,m);
                         write(f,'-');
                          for i := n downto  1 do
                             write(f,b[i]);
                         end else
                           if (t = 0) then
                           write(f,0);
                           close(f);
                 end;
begin
  nhap;
  xuat;
end.
 

tengiday

Happy life
Mình đã đọc và đã làm được các thủ tục trù và công rồi. nhưng mình chưa rõ hàm để xử lí số nguyên lơn có dấu ,và luc nào sẽ gọi lại thủ tục trù, thủ tục cộng, trừ..mong bạn chỉ giáo.có thể chi tiết đoạn co de của hai phần trên cho mình được không ak
Bạn xem lại post #12 của mình trong link đó thật kỹ; đó chính là trọng tâm. Mình có 1 đoạn pseudo-code chỉ cho bạn từng trừng hợp. Bài này của bạn là làm về cộng, bài kia là trừ cho nên bạn phải thay đổi nó chút đỉnh.
 
Dùng kiểu chuỗi ANSISTRING (vô tận) để lưu số nhập vào, tính toán thì tách từng chữ số ra rồi xử lí
 
Top