现在的位置: 首页 > 综合 > 正文

多精度数值处理

2013年06月14日 ⁄ 综合 ⁄ 共 1395字 ⁄ 字号 评论关闭

 

所谓多精度值处理,就是在对给定的数据范围,用语言本身提供的数据类型无法直接进行处理(主要指加减乘除运算),而需要采用特殊的处理办法进行。看看下面的例子。
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.

抱歉!评论已关闭.