一种高精度算法

   将数表示为 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