高精度加法的优化

改善高精度运算的效率

•以上接触到的高精度存储方法是用一个整型数组来表示一个很大的数,数组中的每一个数表示一位十进制数字。但这种方法的缺点是,如果十进制数的位数很多,则对应数组的长度会很长,并增加了高精度计算的时间。那么有什么方法可以改善高精度运算的效率呢?
 
•我们可以考虑用一个数记录2位数字、3位数字或更多位数字。理论上来说,数组中的每个数表示的数字越多,数组的长度就越短,程序运行的时间也就越短。但是,我们还需考虑到计算机中的一个数的取值范围,必须保证它们在运算过程中不会越界。在权衡了两方面的情况后得出:如果只有加减法运算,那么可以用一个longint记录9位数字(十亿进制),如果有加减乘除运算,那么用一个longint记录4位数字(万进制)是最佳方案。我们以万进制为例,来看一下优化的方法:
 
 1 var
 2  s1,s2:string;
 3 procedure plus(s1,s2:string);
 4 var
 5  a,b,c:array[1..500]of longint;
 6  i,j1,j2,l,k,p,code:longint;
 7 begin
 8  fillchar(a,sizeof(a),0);
 9  fillchar(b,sizeof(b),0);
10  fillchar(c,sizeof(c),0);
11  j1:=0; l:=length(s1);
12  while l>0 do
13  begin
14   inc(j1);
15   val(copy(s1,l-3,4),a[j1],code);
16   s1:=copy(s1,1,l-4); l:=length(s1);
17  end;
18  j2:=0; l:=length(s2);
19  while l>0 do
20  begin
21   inc(j2);
22   val(copy(s2,l-3,4),b[j2],code);
23   s2:=copy(s2,1,l-4); l:=length(s2);
24  end;
25  if j1>j2 then p:=j1 else p:=j2;
26  k:=0;
27 for i:=1 to p do
28  begin
29   c[i]:=a[i]+b[i]+k;
30   k:=c[i] div 10000;
31   c[i]:=c[i] mod 10000;
32  end;
33  if k=1 then
34  begin
35   inc(p); inc(c[p]);
36  end;
37  write(c[p]);
38  for i:=p-1 downto 1 do
39  begin
40   if c[i]<10 then write('000',c[i]) else
41   if c[i]<100 then write('00',c[i]) else
42   if c[i]<1000 then write('0',c[i]) else
43   write(c[i]);
44  end;
45  writeln;
46 end;
47 begin
48  readln(s1);
49  readln(s2);
50  plus(s1,s2);
51 end.

 

posted @ 2015-12-06 19:57  ZJQCation  阅读(745)  评论(0编辑  收藏  举报