3117 高精度练习之乘法
题目描述 Description给出两个正整数A和B,计算A*B的值。保证A和B的位数不超过500位。
输入描述 Input Description读入两个用空格隔开的正整数
输出描述 Output Description输出A*B的值
样例输入 Sample Input3 12
样例输出 Sample Output36
数据范围及提示 Data Size & Hint两个正整数的位数不超过500位
模拟乘法的运算。不过在此题中巧妙地先计算各位的值,得出结果后再在各位分析进位的方法,极大的提高了算法的效率。
附AC代码:
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 5 const int MAX=550; 6 7 char al[MAX],bl[MAX]; 8 int a[MAX],b[MAX],c[MAX]; 9 10 11 int main(){ 12 while(cin>>al>>bl){ 13 memset(a,0,sizeof(a)); 14 memset(b,0,sizeof(b)); 15 memset(c,0,sizeof(c)); 16 int lena=strlen(al); 17 int lenb=strlen(bl); 18 for(int i=0;i<lena;i++){//逆向存入数组 19 a[lena-i]=al[i]-48; 20 } 21 for(int i=0;i<lenb;i++){ 22 b[lenb-i]=bl[i]-48; 23 } 24 int x=1,ans,t,k=0; 25 for(int i=1;i<=lenb;i++){//先将各位的值保存在各个位数的位置 26 t=k; 27 for(int j=1;j<=lena;j++){ 28 c[t]+=a[j]*b[i]; 29 t++; 30 } 31 k++; 32 ans=t; 33 } 34 for(int i=0;i<ans;i++){//处理进位 35 while(c[i]>=10){ 36 c[i]-=10; 37 c[i+1]++; 38 } 39 } 40 if(c[ans]!=0){//判断首位是否为0 41 for(int i=ans;i>=0;i--){ 42 cout<<c[i]; 43 } 44 } 45 else{ 46 for(int i=ans-1;i>=0;i--){ 47 cout<<c[i]; 48 } 49 } 50 cout<<endl; 51 } 52 return 0; 53 }