分析:使用64位来保存整数,一个64位保存9位,最后920ms飘过,如果使用ASCII码模拟绝对TLE。貌似这题可以使用FFT(快速傅立叶变换)解决,但是这种方法比较复杂,还没有理解。
#include<iostream>
using namespace std;
__int64 a[10001],b[10001]; //整数a,b,每个存储9位
__int64 ans[40001]; //结果
char sa[50001],sb[50001]; //字符串a,b
int la,lb,l; //整数a,b及结果的长度
#define MOD 1000000000
void s2int(char* ss,__int64* t,int& k) //字符串转换为64位整形
{
int len,j;
__int64 tp=0,p=1,d=1;
len=strlen(ss);
k=0;
for(j=len-1;j>=0;j--)
{
tp+=(__int64)(ss[j]-'0')*d;
if(p>=9)
{
t[k++]=tp;
tp=0;
p=d=1;
}
else
{
p++;
d*=10;
}
}
t[k++]=tp;
}
void show()
{
int i;
printf("%I64d",ans[l-1]);
for(i=l-2;i>=0;i--)
printf("%09I64d",ans[i]);
printf("\n");
}
void solve()
{
int i,j;
__int64 jf;
memset(a,0,sizeof(sa));
memset(b,0,sizeof(sb));
s2int(sa,a,la); //转换为整形
s2int(sb,b,lb);
memset(ans,0,(la+lb+2)*sizeof(__int64));
for(i=0;i<la;i++)
{
jf=0;
l=i;
for(j=0;j<lb;j++)
{
jf+=a[i]*b[j]+ans[l];
ans[l++]=jf%MOD;
jf/=MOD;
}
while(jf)
{
jf+=ans[l];
ans[l++]=jf%MOD;
jf/=MOD;
}
}
show();
}
int main()
{
while(scanf("%s%s",sa,sb)==2)
{
solve();
}
return 0;
}
HDU ACM 1402 A * B Problem Plus
原文地址:http://blog.csdn.net/a809146548/article/details/46335145