【高精度】-DLUTOJ-1176-大数乘法
发布时间:2020-12-14 03:43:51 所属栏目:大数据 来源:网络整理
导读:题目链接:http://acm.dlut.edu.cn/problem.php?id=1176 题目描述:赤裸的大数乘法 解题思路: 突然想到自己没写过高精度乘法,就回咱们自己OJ上找出了这道题,赤裸的高精度乘法而已,没想到依然觉得不好写,准确说来是我从小到大算乘法的习惯使我产生了错觉
题目链接:http://acm.dlut.edu.cn/problem.php?id=1176 题目描述:赤裸的大数乘法 解题思路: 突然想到自己没写过高精度乘法,就回咱们自己OJ上找出了这道题,赤裸的高精度乘法而已,没想到依然觉得不好写,准确说来是我从小到大算乘法的习惯使我产生了错觉:“ 想写大数乘法就得先写一个大数加法出来 ”。喂!我短路了半天才想明白,int 数组里可以存个两位数啊,再进位不就好了。(#`O′) 。。然后又照刘汝佳说的把数组反过来写,果然方便了一些。 AC代码: #include <iostream> #include <cstring> #include <cstdio> using namespace std; char a[300],b[300]; int ra[300],rb[300],cal[300],temp[300],ans[300],la,lb,point; void dancheng(int a[],int b) { int i,j,k,t,c=0; for(i=0;i<300;i++) { t=a[i]*b+c; c=t/10; temp[i]=t%10; } for(k=250;k>=0;k--)if(temp[k])break; for(i=point,j=0;j<=k;i++,j++) { ans[i]+=temp[j]; } point++; } void cheng(char a[],char b[]) { int i,j; for(i=la-1,j=0;i>=0;j++,i--) ra[j]=a[i]-'0'; for(i=lb-1,i--) rb[j]=b[i]-'0'; for(i=0;i<lb;i++) { memset(temp,sizeof(temp)); dancheng(ra,rb[i]); } } int main() { int T,i,c=0; cin>>T; while(T--) { memset(a,sizeof(a)); memset(b,sizeof(b)); memset(ans,sizeof(ans)); memset(ra,sizeof(ra)); memset(rb,sizeof(rb)); point=0; cin>>a>>b; if(strlen(a)>strlen(b)) { la=strlen(a); lb=strlen(b); cheng(a,b); } else { la=strlen(b); lb=strlen(a); cheng(b,a); } for(i=0;i<250;i++) { t=ans[i]+c; c=t/10; ans[i]=t%10; } for(i=250;i>=0;i--)if(ans[i])break; if(i==-1) cout<<0; else for(;i>=0;i--)cout<<ans[i]; cout<<endl; } return 0; } AC截图: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |