http://acm.hdu.edu.cn/showproblem.php?pid=1402
我的代码,由于时间的问题,以后找机会优化了!(超时)
View Code
#include"iostream"
#define M 100010
using namespace std;
char ch1[M],ch2[M];
int a[M],b[M];
int c[M],d[M];
int num[M];
int H[M];
int t,k,g,v;
int i,j;
int La,Lb;
int sign=0;
void Add(int x ,int y)
{
sign=0; t=0;
int p,q,flag=0;
if(x>y)
{
for(p=0,q=0;p<y,q<y; p++,q++)
{
num[t++]=(d[p]+H[q]+flag)%10;
flag=(d[p]+H[q]+flag)%10;
}
for(p=y; p<x ; p++)
{
num[t++]=(d[p]+flag)%10;
flag=(d[p]+flag)/10;
}
}
else if(x==y)
{
for(p=0,q=0;p<x,q<y; p++,q++)
{
num[t++]=(d[p]+H[q]+flag)%10;
flag=(d[p]+H[q]+flag)/10;
}
}
else
{
flag=0;
for(p=0,q=0;p<x,q<x; p++,q++)
{
num[t++]=(H[p]+d[q]+flag)%10;
flag=(H[p]+d[q]+flag)/10;
}
for(q=x;q<y;q++)
{
num[t++]=(H[q]+flag)%10;
flag=(H[q]+flag)/10;
}
}
while(flag)
{
num[t++]=flag%10;
flag/=10;
}
for(int yy=0; yy<t;yy++)
{
d[yy]=num[yy];
if(d[yy]==0) sign++; //sign用于标记都为结果0的情况
}
g=t;
memset(H , 0 , sizeof(H));
memset(num, 0, sizeof(num));
}
void BigN()
{
int flag=0;
int mark=0;
if(La>Lb)
{
for(i=Lb-1;i>=0;i--)
{
k=0;
for(j=La-1;j>=0;j--)
{
c[k++]=(b[i]*a[j]+flag)%10;
flag=(b[i]*a[j]+flag)/10;
}
while(flag)
{
c[k++]=flag%10;
flag/=10;
}
//末尾赋值0
v=0;
for(int xx=0; xx<mark; xx++)
H[v++]=0;
for(int m=0;m<k;m++)
H[v++]=c[m];
memset(c,0,sizeof(c));
//****************************
Add(g , v);
mark++;
}
}
else
{
for(i=La-1;i>=0;i--)
{
k=0;
for(j=Lb-1;j>=0;j--)
{
c[k++]=(a[i]*b[j]+flag)%10;
flag=(a[i]*b[j]+flag)/10;
}
while(flag)
{
c[k++]=flag%10;
flag/=10;
}
//末尾赋值0
v=0;
for(int xx=0; xx<mark; xx++)
H[v++]=0;
for(int m=0;m<k;m++)
H[v++]=c[m];
//****************************
Add(g , v);
mark++;
}
}
}
int main()
{
while(cin>>ch1>>ch2)
{
t=0;k=0;g=0;
La=strlen(ch1);
Lb=strlen(ch2);
for(i=0;i<La;i++) a[i]=ch1[i]-'0';
for(i=0;i<Lb;i++) b[i]=ch2[i]-'0';
BigN();
if(sign!=t)
{
for(i=t-1;i>=0;i--)
cout<<d[i];
cout<<endl;
}
else cout<<"0"<<endl;
}
return 0;
}
一位dn的,神人啊!
http://www.cppblog.com/misschuer/archive/2010/01/16/80356.html
View Code
#include<iostream>
#include<cmath>
using namespace std;
typedef struct vir{
double re,im;
vir(){}
vir(double a,double b){re=a;im=b;}
vir operator +(const vir &b){ return vir(re+b.re,im+b.im);}
vir operator -(const vir &b){ return vir(re-b.re,im-b.im);}
vir operator *(const vir &b){ return vir(re*b.re-im*b.im,re*b.im+b.re*im);}
}vir;
vir x1[200005],x2[200005];
const double Pi = acos(-1.0);
void change(vir *x,int len,int loglen)
{
int i,j,k,t;
for(i=0;i<len;i++)
{
t = i;
for(j=k=0;j<loglen;j++,t>>=1)
k = (k<<1)|(t&1);
if(k<i)
{
vir wt = x[k];
x[k] = x[i];
x[i] = wt;
}
}
}
void fft(vir *x,int len,int loglen)
{
int i,j,t,s,e;
change(x,len,loglen);
t = 1;
for(i=0;i<loglen;i++,t<<=1)
{
s = 0;
e = s + t;
while(s<len)
{
vir a,b,wo(cos(Pi/t),sin(Pi/t)),wn(1,0);
for(j=s;j<s+t;j++)
{
a = x[j];
b = x[j+t]*wn;
x[j] = a + b;
x[j+t] = a - b;
wn =wn*wo;
}
s = e+t;
e = s+t;
}
}
}
void dit_fft(vir *x,int len,int loglen)
{
int i,j,s,e,t=1<<loglen;
for(i=0;i<loglen;i++)
{
t>>=1;
s=0;
e=s+t;
while(s<len)
{
vir a,b,wn(1,0),wo(cos(Pi/t),-sin(Pi/t));
for(j=s;j<s+t;j++)
{
a = x[j]+x[j+t];
b = (x[j]-x[j+t])*wn;
x[j] = a;
x[j+t] = b;
wn = wn*wo;
}
s = e+t;
e = s+t;
}
}
change(x,len,loglen);
for(i=0;i<len;i++)
x[i].re/=len;
}
int main()
{
char a[100005],b[100005];
int i,len1,len2,t,over,len,loglen;
while(scanf("%s%s",a,b)!=EOF)
{
len1 = strlen(a)<<1;
len2 = strlen(b)<<1;
len = 1;
loglen = 0;
while(len<len1)
{
len<<=1;
loglen++;
}
while(len<len2)
{
len<<=1;
loglen++;
}
for(i=0;a[i]!='\0';i++)
{
x1[i].re = a[i]-'0';
x1[i].im = 0;
}
for(;i<len;i++)
x1[i].re = x1[i].im = 0;
for(i=0;b[i]!='\0';i++)
{
x2[i].re = b[i]-'0';
x2[i].im = 0;
}
for(;i<len;i++)
x2[i].re = x2[i].im = 0;
fft(x1,len,loglen);
fft(x2,len,loglen);
for(i=0;i<len;i++)
x1[i] = x1[i]*x2[i];
dit_fft(x1,len,loglen);
for(i=(len1+len2)/2-2,over=loglen=0;i>=0;i--)
{
t = x1[i].re + over + 0.5;
a[loglen++] = t%10;
over = t/10;
}
while(over)
{
a[loglen++] = over%10;
over /= 10;
}
for(loglen--;loglen>=0&&!a[loglen];loglen--);
if(loglen<0)
putchar('0');
else
for(;loglen>=0;loglen--)
putchar(a[loglen]+'0');
putchar('\n');
}
return 0;
}