一种高精度算法
将数表示为 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