高精度乘除运算优化
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数组清零。
所以,该优化方法适用于普通数乘或者除普通数的高精运算。
质因子表
相关文章推荐
- 2016寒假训练1
- HDU 1391:Number Steps
- ubuntu系统安装软件方法
- SpringMVC+Mongo简单配置
- 结构体排序
- JAVA之NIO按行读写大文件,完美解决中文乱码问题
- MySQL的ODBC安装错误问题!
- MySQL的ODBC安装错误问题!
- MySQL的ODBC安装错误问题!
- git找回当前目录下误删的所有文件
- git 错误
- opencv(7)
- linux 命令
- codeforces 621D Rat Kwesh and Cheese
- LightOJ1005 Rooks(DP/排列组合)
- codeforces 621C Wet Shark and Flowers
- 奇数变成最大的偶数
- codeforces 621B Wet Shark and Bishops
- 解析url参数
- 爱上机器学习