zoukankan      html  css  js  c++  java
  • 高精度加法的优化

    改善高精度运算的效率

    •以上接触到的高精度存储方法是用一个整型数组来表示一个很大的数,数组中的每一个数表示一位十进制数字。但这种方法的缺点是,如果十进制数的位数很多,则对应数组的长度会很长,并增加了高精度计算的时间。那么有什么方法可以改善高精度运算的效率呢?
     
    •我们可以考虑用一个数记录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.
  • 相关阅读:
    CharacterEncodingFilter详解及源码解析
    SPI 串行Flash闪存W25Q128FV 的使用(STM32F407)_硬件篇
    STM32 TFT LCD
    什么叫状态机:按键消抖实例
    STM32 ADC单通道采集 (STM32F103C8T6 ADC1的0通道 )
    STM32 PWM输出 (STM32F103C8T6 TIM2_CH2 )
    STM32 多通道ADC连续采集之数据到内存 DMA传输
    STM32 DAM之串口通讯
    STM32定时器之PWM 4路输出 TIM3、TIM14
    STM32定时器 TIM14之PWM 可调脉宽输出 呼吸灯
  • 原文地址:https://www.cnblogs.com/vacation/p/5024225.html
Copyright © 2011-2022 走看看