大数乘法 V2
发布时间:2020-12-14 04:51:10 所属栏目:大数据 来源:网络整理
导读:给出2个大整数A,B,计算A*B的结果。 Input 第1行:大数A第2行:大数B(A,B的长度?=?100000,A,B?=?0) Output 输出A?*?B Input示例 123456234567 Output示例 28958703552 #include iostream#include stdio.h#include cmath#include algorithm#include cstring
给出2个大整数A,B,计算A*B的结果。
Input
第1行:大数A 第2行:大数B (A,B的长度?<=?100000,A,B?>=?0)
Output
输出A?*?B
Input示例
123456 234567
Output示例
28958703552 #include <iostream> #include <stdio.h> #include <cmath> #include <algorithm> #include <cstring> #include <vector> using namespace std; const int N = 5e5 + 10; const double PI = acos(-1.0); struct Vir { double re,im; Vir(double _re = 0.0,double _im = 0.0) :re(_re),im(_im) {} Vir operator*(Vir r) { return Vir(re*r.re - im*r.im,re*r.im + im*r.re); } Vir operator+(Vir r) { return Vir(re + r.re,im + r.im); } Vir operator-(Vir r) { return Vir(re - r.re,im - r.im); } }; void bit_rev(Vir *a,int loglen,int len) { for (int i = 0; i < len; ++i) { int t = i,p = 0; for (int j = 0; j < loglen; ++j) { p <<= 1; p = p | (t & 1); t >>= 1; } if (p < i) { Vir temp = a[p]; a[p] = a[i]; a[i] = temp; } } } void FFT(Vir *a,int len,int on) { bit_rev(a,loglen,len); for (int s = 1,m = 2; s <= loglen; ++s,m <<= 1) { Vir wn = Vir(cos(2 * PI*on / m),sin(2 * PI*on / m)); for (int i = 0; i < len; i += m) { Vir w = Vir(1.0,0); for (int j = 0; j < m / 2; ++j) { Vir u = a[i + j]; Vir v = w*a[i + j + m / 2]; a[i + j] = u + v; a[i + j + m / 2] = u - v; w = w*wn; } } } if (on == -1) { for (int i = 0; i < len; ++i) a[i].re /= len,a[i].im /= len; } } char a[N/2],b[N/2]; Vir pa[N],pb[N]; int ans[N]; int main() { scanf("%s%s",a,b); int lena = strlen(a); int lenb = strlen(b); int n = 1,loglen = 0; while (n < lena + lenb) { n <<= 1,loglen++; } for (int i = 0,j = lena - 1; i < n; ++i,--j) { pa[i] = Vir(j >= 0 ? a[j] - '0' : 0.,0.); } for (int i = 0,j = lenb - 1; i < n; ++i,--j) { pb[i] = Vir(j >= 0 ? b[j] - '0' : 0.,0.); } for (int i = 0; i <= n; ++i) { ans[i] = 0; } FFT(pa,n,1); FFT(pb,1); for (int i = 0; i < n; ++i) { pa[i] = pa[i] * pb[i]; } FFT(pa,-1); for (int i = 0; i < n; ++i) { ans[i] = pa[i].re + 0.5; } for (int i = 0; i<n; ++i) { ans[i + 1] += ans[i] / 10,ans[i] %= 10; } int pos = lena + lenb - 1; for (; pos>0 && ans[pos] <= 0; --pos); { for (; pos >= 0; --pos) { printf("%d",ans[pos]); } puts(""); } return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |