首页 > 代码库 > wiki oi3117 高精度练习之乘法

wiki oi3117 高精度练习之乘法

题目描述 Description

给出两个正整数A和B,计算A*B的值。保证A和B的位数不超过500位。

输入描述 Input Description

读入两个用空格隔开的正整数

输出描述 Output Description

输出A*B的值

样例输入 Sample Input

3 12

样例输出 Sample Output

36

数据范围及提示 Data Size & Hint

两个正整数的位数不超过500位

代码:

 1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<iostream> 5 #include<algorithm> 6 using namespace std; 7 char a[500],b[500]; 8 int c[502],d[1500];//c存中间数据,d不断累加c得答案 9 int main()10 {11     memset(c,0,sizeof(c));12     memset(d,0,sizeof(d));13     cin>>a>>b;14     int alen=strlen(a)-1;15     int blen=strlen(b)-1;16     for(int i=alen; i>=0; i--)17     {18         int carry=0,carry1=0,k=0,m=0;//k作c的下标,m作d的下标,carry为c(乘)的进位,carry1为d(累加)的进位19         for(int j=blen; j>=0; j--)20         {21             int cc=(a[i]-0)*(b[j]-0)+carry;22             c[k++]=cc%10;23             carry=cc/10;24         }25         if(carry!=0)c[k++]=carry;//注意乘最后一位后可能还有进位26 //        for(int n=k-1; n>=0; n--)printf("%d",c[n]);//查看c的中间数据27 //        printf("\n");28         m=alen-i;29         for(int l=0; l<k; l++)30         {31             int cc=(d[m]+c[l])+carry1;32             d[m++]=cc%10;33             carry1=cc/10;34         }35         if(carry1!=0)d[m++]=carry1;//注意累加到最后一位后可能还有进位36 //        for(int n=m-1; n>=0; n--)printf("%d",d[n]);37 //        printf("\n");38     }39         for(int n=m-1; n>=0; n--)printf("%d",d[n]);40         printf("\n");41     return 0;42 }

 

wiki oi3117 高精度练习之乘法