博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
高精度求A*B(FFT)
阅读量:4965 次
发布时间:2019-06-12

本文共 2663 字,大约阅读时间需要 8 分钟。

A * B Problem Plus

链接:

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 26449    Accepted Submission(s): 6917

Problem Description
Calculate A * B.
 

 

Input
Each line will contain two integers A and B. Process to end of file.
Note: the length of each integer will not exceed 50000.
 

 

Output
For each case, output A * B in one line.
 

 

Sample Input
1 2 1000 2
 

 

Sample Output
2 2000
 

 

Author
DOOM III
 代码:
#include 
#include
#include
#include
#include
using namespace std;const double PI = acos(-1.0);//复数结构体struct complex{ double r,i; complex(double _r = 0.0,double _i = 0.0) { r = _r; i = _i; } complex operator +(const complex &b) { return complex(r+b.r,i+b.i); } complex operator -(const complex &b) { return complex(r-b.r,i-b.i); } complex operator *(const complex &b) { return complex(r*b.r-i*b.i,r*b.i+i*b.r); }};/* * 进行FFT和IFFT前的反转变换。 * 位置i和 (i二进制反转后位置)互换 * len必须去2的幂 */void change(complex y[],int len){ int i,j,k; for(i = 1, j = len/2;i < len-1; i++) { if(i < j)swap(y[i],y[j]); //交换互为小标反转的元素,i
= k) { j -= k; k /= 2; } if(j < k) j += k; }}/* * 做FFT * len必须为2^k形式, * on==1时是DFT,on==-1时是IDFT */void fft(complex y[],int len,int on){ change(y,len); for(int h = 2; h <= len; h <<= 1) { complex wn(cos(-on*2*PI/h),sin(-on*2*PI/h)); for(int j = 0;j < len;j+=h) { complex w(1,0); for(int k = j;k < j+h/2;k++) { complex u = y[k]; complex t = w*y[k+h/2]; y[k] = u+t; y[k+h/2] = u-t; w = w*wn; } } } if(on == -1) for(int i = 0;i < len;i++) y[i].r /= len;}const int MAXN = 200010;complex x1[MAXN],x2[MAXN];char str1[MAXN/2],str2[MAXN/2];int sum[MAXN];int main(){ ios_base::sync_with_stdio(0); cin.tie(0); while(cin>>str1>>str2) { int len1 = strlen(str1); int len2 = strlen(str2); int len = 1; while(len < len1*2 || len < len2*2)len<<=1; for(int i = 0;i < len1;i++) x1[i] = complex(str1[len1-1-i]-'0',0);//这里的len1-1-i主要是为了下面的求和 for(int i = len1;i < len;i++) x1[i] = complex(0,0); for(int i = 0;i < len2;i++) x2[i] = complex(str2[len2-1-i]-'0',0); for(int i = len2;i < len;i++) x2[i] = complex(0,0); //求DFT fft(x1,len,1); fft(x2,len,1); for(int i = 0;i < len;i++) x1[i] = x1[i]*x2[i]; fft(x1,len,-1); for(int i = 0;i < len;i++) sum[i] = (int)(x1[i].r+0.5); for(int i = 0;i < len;i++) { sum[i+1]+=sum[i]/10; sum[i]%=10; } len = len1+len2-1; while(sum[len] <= 0 && len > 0)len--; for(int i = len;i >= 0;i--) printf("%c",sum[i]+'0'); printf("\n"); } return 0;}

 

转载于:https://www.cnblogs.com/zhgyki/p/9492843.html

你可能感兴趣的文章
爱可生技术文档
查看>>
vuex 学习 01
查看>>
剧烈变化的移动互联网O2O
查看>>
SVG文档的注意事项
查看>>
Intellij中快捷键
查看>>
找出十进制数中出现的''一''的个数
查看>>
注册页实现激活邮箱验证(asp.net c#) 详细实现
查看>>
打造完美的IE网页木马
查看>>
CF1109A Sasha and a Bit of Relax
查看>>
【Foreign】登山 [DP][数学]
查看>>
【codeforces】【比赛题解】#948 CF Round #470 (Div.2)
查看>>
关于实现线程死锁的一个例子
查看>>
FMDB保存数据小数
查看>>
JAVA中抽象类的一些总结
查看>>
分页, 解析器, 渲染器
查看>>
fedora输入法
查看>>
关于数组去重的几种方法-------javascript描述
查看>>
Vue.js系列之三模板语法
查看>>
hihoCoder #1238 Total Highway Distance
查看>>
JAVA基础(7)-数组的排序
查看>>