A * B Problem Plus
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
求A*B,多存几位就可以过,或者用FFT
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; int a[50100]; long long A[50100]; long long B[50100]; int b[50100]; long long ans[1000001]; int main() { string s1,s2; while(cin>>s1>>s2) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(A,0,sizeof(A)); memset(B,0,sizeof(B)); memset(ans,0,sizeof(ans)); int l=0,r=0; if(s1=="0"||s2=="0") { printf("0 "); continue; } for(int i=s1.size()-1; i>=0; i--) a[l++]=s1[i]-'0'; for(int i=s2.size()-1; i>=0; i--) b[r++]=s2[i]-'0'; int L=0,R=0; for(int i=0; i<l; i+=6) { A[L++]=a[i+5]*100000+a[i+4]*10000+a[i+3]*1000+a[i+2]*100+a[i+1]*10+a[i]; //cout<<A[L-1]; } for(int i=0; i<r; i+=6) { B[R++]=b[i+5]*100000+b[i+4]*10000+b[i+3]*1000+b[i+2]*100+b[i+1]*10+b[i]; //cout<<B[R-1]; } long long p; for(int i=0; i<L; i++) { long long c=0; for(int j=0; j<R; j++) { long long temp=A[i]*B[j]+ans[i+j]+c; //cout<<temp<<endl; ans[i+j]=temp%1000000; c=temp/1000000; p=j; } if(c) ans[i+p+1]=c; } int x=L+R; for(x; ans[x]==0; x--); printf("%lld",ans[x]); x--; for(x; x>=0; x--) printf("%06lld",ans[x]); cout<<endl; } }
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> #include<math.h> using namespace std; const double PI=acos(-1.0); struct Complex { double x,y; Complex(double _x=0.0,double _y=0.0) { x=_x; y=_y; } Complex operator-(const Complex &b)const{return Complex(x-b.x,y-b.y);} Complex operator+(const Complex &b)const{return Complex(x+b.x,y+b.y);} Complex operator*(const Complex &b)const{return Complex(x*b.x-y*b.y,x*b.y+y*b.x);} }; 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]); k=len/2; while(j>=k) { j-=k; k/=2; } if(j<k)j+=k; } } 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].x/=len; } } } const int MAXN=200010; Complex x1[MAXN],x2[MAXN]; char str1[MAXN/2],str2[MAXN/2]; int sum[MAXN]; int main() { while(~scanf("%s%s",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); 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); 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].x+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(" "); } return 0; }