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
( n,m <= 32000 chữ số)
VD
inp
3 3
222
-333
out
-111
https://vfo.vn/t/showthread.php?96739-baI-TAP-XU-LY-SO-NGUYEN-LON-MOI-NGUOI-GIUP-VOI
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.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![]()
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;
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.
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.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