分析:使用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