改善高精度运算的效率
•以上接触到的高精度存储方法是用一个整型数组来表示一个很大的数,数组中的每一个数表示一位十进制数字。但这种方法的缺点是,如果十进制数的位数很多,则对应数组的长度会很长,并增加了高精度计算的时间。那么有什么方法可以改善高精度运算的效率呢?
•我们可以考虑用一个数记录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.