HDU ACM 1402 A * B Problem Plus

来源:互联网 发布:淘宝店铺推广策划 编辑:程序博客网 时间:2024/05/16 09:51

分析:使用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,bint la,lb,l;              //整数a,b及结果的长度#define MOD 1000000000void 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;      }


0 0
原创粉丝点击