• 高精度加法的优化


    改善高精度运算的效率

    •以上接触到的高精度存储方法是用一个整型数组来表示一个很大的数,数组中的每一个数表示一位十进制数字。但这种方法的缺点是,如果十进制数的位数很多,则对应数组的长度会很长,并增加了高精度计算的时间。那么有什么方法可以改善高精度运算的效率呢?
     
    •我们可以考虑用一个数记录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.
  • 相关阅读:
    ReentrantLock和AQS
    CAS
    java8中ConcurrentHashMap
    java8中的HashMap
    TCP和UDP
    慢查询日志和profiling
    explain的使用
    select、poll、epoll之间的区别
    I/O模型
    生产者-消费者模式
  • 原文地址:https://www.cnblogs.com/vacation/p/5024225.html
Copyright © 2020-2023  润新知