本文主要是介绍【高精度】-DLUTOJ-1176-大数乘法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目链接: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,j=0;i>=0;j++,i--)rb[j]=b[i]-'0';for(i=0;i<lb;i++){memset(temp,0,sizeof(temp));dancheng(ra,rb[i]);}
}int main()
{int T,i,t,c=0;cin>>T;while(T--){memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(ans,0,sizeof(ans));memset(ra,0,sizeof(ra));memset(rb,0,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;elsefor(;i>=0;i--)cout<<ans[i];cout<<endl;}return 0;
}
AC截图:
这篇关于【高精度】-DLUTOJ-1176-大数乘法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!