Đăng ngày: 23:30 23-10-2009
uses crt;
type TroChuSo=^ChuSoMoRong;
ChuSoMoRong=record
ChuSo:char;
Next,Prev:TroChuSo;
end;
var Fa,Fb,Fc,La,Lb,Lc,Heap:TroChuSo;
procedure NhapSo(var Fs,Ls:TroChuSo);
var ch:char;
S:TrochuSo;
begin
Fs:=Nil;
Ls:=Nil;
repeat
repeat ch:=readkey until ch in ['0'..'9',#13];
if ch<>#13 then
begin
write(ch);
New(S);
S^.ChuSo:=ch;
S^.Next:=Nil;
if Fs=Nil then Fs:=S
else Ls^.Next:=S;
S^.Prev:=Ls;
Ls:=S;
end;
until ch=#13;
writeln;
end;
procedure XuatSo(Fs:TroChuSo);
var S:TrochuSo;
begin
S:=Fs;
while S<>Nil do
begin
write(S^.ChuSo);
S:=S^.Next
end;
writeln;
end;
procedure CanBang(var Fa,La,Fb,Lb:TroChuSo);
var A,B,S:TroChuSo;
begin
A:=La;
B:=Lb;
while (A<>Nil) and (B<>Nil) do
begin
A:=A^.Prev;
B:=B^.Prev;
end;
if B=Nil then
while A<>Nil do
begin
New(S);
S^.ChuSo:='0';
S^.Prev:=Nil;
if Lb=Nil then Lb:=S
else Fb^.Prev:=S;
Fb:=S;
A:=A^.Prev;
end
else
if A=Nil then
while B<>Nil do
begin
New(S);
S^.ChuSo:='0';
S^.Prev:=Nil;
if La=Nil then La:=S
else Fa^.Prev:=S;
Fa:=S;
B:=B^.Prev;
end;
end;
procedure Cong(Fa,La,Fb,Lb:TroChuSo; var Fc,Lc:TroChuSo);
var A,B,C:TroChuSo;
nho:byte;
begin
CanBang(Fa,La,Fb,Lb);
A:=La;
B:=Lb;
Fc:=Nil;
Lc:=Nil;
nho:=0;
while (A<>Nil) do
begin
New(C);
C^.ChuSo:=chr((ord(A^.ChuSo)-48+ord(B^.ChuSo)-48+nho) mod 10+48);
nho:=(ord(A^.ChuSo)-48+ord(B^.ChuSo)-48+nho) div 10;
C^.Prev:=Nil;
if Lc=Nil then Lc:=C
else Fc^.Prev:=C;
C^.Next:=Fc;
Fc:=C;
A:=A^.Prev;
B:=B^.Prev;
end;
if nho=1 then
begin
New(C);
C^.ChuSo:='1';
C^.Prev:=Nil;
Fc^.Prev:=C;
C^.Next:=Fc;
Fc:=C;
end;
end;
BEGIN
Mark(Heap);
repeat
writeln('Nhap A = ');
NhapSo(Fa,La);
writeln('Nhap B = ');
NhapSo(Fb,Lb);
Cong(Fa,La,Fb,Lb,Fc,Lc);
writeln('A+B=');
XuatSo(Fc);
until readkey=#27;
Release(Heap);
END.
Chú ý:
Sắp có bài mới viết về chủ đề này, nhưng chỉ cần liên kết một chiều!