题目描述 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(" "); 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(" "); 38 } 39 for(int n=m-1; n>=0; n--)printf("%d",d[n]); 40 printf(" "); 41 return 0; 42 }