多精度数值处理

本文介绍了一种处理超长整数加法的算法,通过将整数拆分为数组元素,实现了不受数据类型限制的精确加法运算。适用于Pascal等编程语言。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值