一种高精度算法

it2022-05-09  33

   将数表示为 10^k 进制数,k最大为9,否则超出了longint的范围。k取9比较合适,因为这样的两个数相加最大是2*10^9 ,是在longint的范围内的,中间结果不会上溢。

  相加相乘就按运算法则进行计算即可。

  输出结果时(即变回10进制数时),只需将每位数用“0”补齐然后直接输出即可(这就是表示成10^k进制的原因,输出方便,不需转换)。

  下面是代码(PASCAL)const    base = 1000000000;//定义10^9进制type    num = array[1..121] of longint;  //定义数据类型operator +(n1,n2:num)r:num; //加号运算符重载var    i:longint;begin    fillchar(r,sizeof(r),0);    for i:=121 downto 1 do    begin        r[i]:=r[i]+n1[i]+n2[i];        if r[i]>=base then        begin            r[i-1]:=r[i] div base;            r[i]:=r[i] mod base;        end;    end;    exit(r);end;procedure print(n:num); //输出var    i,p:longint;    s:string;begin    p:=0;    for i:=1 to 121 do      if n[i]<>0 then        begin p:=i; break; end;    if p=0 then begin write(0); exit; end;    write(n[p]);    for i:=p+1 to 121 do    begin        str(n[i],s);        while length(s)<9 do s:='0'+s;        write(s);    end;end;

  这种算法比普通的用字符串表示数的方法要快很多,我用cena测试这样一段代码(加法):

  t1[121]:=987654321; t1[120]:=12345678;    t2[121]:=123456789; t2[120]:=98765432;    for i:=1 to 200000 do    begin        t3:=t1+t2;        t1:=t3;    end;

  字符串表示法代码为:

    s1:='12345678987654321';    s2:='98765432123456789';    for i:=1 to 300000 do    begin        s3:=jia(s1,s2);        s1:=s3;    end;

  测试结果如下

字符串表示:

这种方法:

转载于:https://www.cnblogs.com/noanti/archive/2011/10/14/2211292.html


最新回复(0)