您的位置:首页 > 其它

高精度乘除运算优化

2016-02-01 20:48 309 查看

方案一:扩大进制

var s1,s2:string;
procedure multiply(s1,s2:string);
var a,b,c:array[1..500]of longint;
i,j,j1,j2,l,k,code:longint;
begin
fillchar(a,sizeof(a),0);
fillchar(b,sizeof(b),0);
fillchar(c,sizeof(c),0);
j1:=0; l:=length(s1);
while l>0 do begin
inc(j1);
val(copy(s1,l-3,4),a[j1],code);
s1:=copy(s1,1,l-4); l:=length(s1);
end;
j2:=0; l:=length(s2);
while l>0 do begin
inc(j2);
val(copy(s2,l-3,4),b[j2],code);
s2:=copy(s2,1,l-4); l:=length(s2);
end;
k:=0;
for i:=1 to j1 do
for j:=1 to j2+1 do begin
c[i+j-1]:=c[i+j-1]+a[i]*b[j]+k;
k:=c[i+j-1] div 10000;
c[i+j-1]:=c[i+j-1] mod 10000;
end;
if c[i+j]=0 then k:=j1+j2-1 else k:=j1+j2;
write(c[k]);
for i:=k-1 downto 1 do begin
if c[i]<10 then write('000',c[i]) else
if c[i]<100 then write('00',c[i]) else
if c[i]<1000 then write('0',c[i]) else
write(c[i]);
end;   writeln;
end;
begin
readln(s1);
readln(s2);
multiply(s1,s2);
end.


方案二:建立质因子表

任何自然数都可以表示为,n=p1^k1×p2^k2,…,×pt^kt的形式,p1,p2,…,pt为质因子。设num数组为自然数n,其中num[i]为因子i的次幂数(1≤i≤k)。显然,num[k],num[k-1],…,num[2]构成了一个自然数,该自然数可以用十进制整数数组ans存储。
ans的计算过程如下:
ans[1] ←1; {将num转换为ans}
for i←2 to k do {枚举每一个因子}
for j←1 to num[i] do multiply(ans,i); {连乘num[i]个因子i}
multiply的过程为高精数乘普通数的乘法运算。
有了自然数n的因子表num,就可以十分方便地进行乘法或除法运算。例如整数x 含有k个因子i,
经过乘法或除法后,



我们按照上述方法依次处理x的每一个因子,得出的num即为积或商。

procedure add(x,ob:longint);    {ob=1,num←num * x;ob=-1,nurn←num/x}
var i:longint;
begin
for i←2 to x do                {搜索x的每一个因子i}
while(x mod i=0) do              {计算x含因子i的个数k。
begin
inc(num[i],ob);
x←x div i;
end;{while}
end;{add}


显然,如果n1=xl*x2*,…,*xk,则可以通过连续调用add(x1,1);add(x2,1);…;add(xk,1); 得出nl对应的因子表num。

如果



则可以通过连续调用add(x1,-1); add(x2,-1); …; add(xk,-1); 得出n2对应的因子表num。注意,初始时num数组清零。
所以,该优化方法适用于普通数乘或者除普通数的高精运算。

质因子表
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: