所谓多精度值处理,就是在对给定的数据范围,用语言本身提供的数据类型无法直接进行处理(主要指加减乘除运算),而需要采用特殊的处理办法进行。看看下面的例子。
例1 从键盘读入两个正整数,求它们的和。
分析:从键盘读入两个数到两个变量中,然后用赋值语句求它们的和,输出。但是,我们知道,在pascal语言中任何数据类型都有一定的表示范围。而当两个被加数据大时,上述算法显然不能求出精确解,因此我们需要寻求另外一种方法。在读小学时,我们做加法都采用竖式方法,如图1。
这样,我们方便写出两个整数相加的算法。
8 5 6 + 2 5 5
1 1 1 1
图1
|
A3 A2 A1
+ B3 B2 B1
C4 C3 C2 C1
图2
|
如果我们用数组A、B分别存储加数和被加数,用数组C存储结果。则上例有
A[1]=6, A[2]=5, A[3]=8, B[1]=5,B[2]=5, B[3]=2, C[4]=1,C[3]=1, C[2]=1,C[1]=1,两数相加如图2所示。由上图可以看出:
C[i]:= A[i]+B[i];
if C[i]>10 then begin C[i]:= C[i] mod 10; C[i+1]:= C[i+1]+1 end;
因此,算法描述如下:
procedure add(a,b;var c);
{ a,b,c都为数组,a存储被加数,b存储加数,c存储结果 }
var i,x:integer;
begin
i:=1
while (i<=a数组长度>0) or(i<=b数组的长度) do begin
x := a[i] + b[i] + x div 10; {第i位相加并加上次的进位}
c[i] := x mod 10; {存储第i位的值}
i := i + 1 {位置指针变量}
end
end;
通常,读入的两个整数用可用字符串来存储,程序设计如下:
program exam1;
const
max=200;
var
a,b,c:array[1..max] of 0..9;
n:string;
lena,lenb,lenc,i,x:integer;
begin
write('Input augend:'); readln(n);
lena:=length(n); {加数放入a数组}
for i:=1 to lena do a[lena-i+1]:=ord(n[i])-ord('0');
write('Input addend:'); readln(n);
lenb:=length(n); {被加数放入b数组}
for i:=1 to lenb do b[lenb-i+1]:=ord(n[i])-ord('0');
i:=1;
while (i<=lena) or(i<=lenb) do begin
x := a[i] + b[i] + x div 10; {两数相加,然后加前次进位}
c[i] := x mod 10; {保存第i位的值}
i := i + 1
end;
if x>=10 then {处理最高进位}
begin lenc:=i;c[i]:=1 end
else lenc:=i-1;
for i:=lenc downto 1 do write(c[i]); {输出结果}
writeln
end.