题目来源:
http://bailian.openjudge.cn/practice/2980/
描述
求两个不超过200位的非负整数的积。
输入
有两行,每行是一个不超过200位的非负整数,没有多余的前导0。
输出
一行,即相乘后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
样例输入
12345678900
98765432100
样例输出
1219326311126352690000
题意描述:
计算两个位数不超过200的非负整数的乘积
解题思路:
先将str1和str2逆置
根据规律计算,再统一处理进位
去除前导零输出即可
程序代码:
1 #include<stdio.h>
2 const int N=230;
3 #include<string.h>
4 int main()
5 {
6 char str1[N],str2[N];
7 int a[N],b[N],result[2*N],i,j,k,l1,l2;
8 while(scanf("%s%s",str1,str2) != EOF)
9 {
10 l1=strlen(str1);
11 l2=strlen(str2);
12 for(j=0,i=l1-1;i>=0;i--)
13 a[j++]=str1[i]-'0';
14 for(j=0,i=l2-1;i>=0;i--)
15 b[j++]=str2[i]-'0';
16 //乘积
17 memset(result,0,sizeof(result));
18 for(i=0;i<l1;i++)
19 for(j=0;j<l2;j++)
20 result[i+j] += a[i]*b[j];
21 //处理进位
22 for(i=0;i<N*2;i++) {
23 if(result[i] > 9)//先计算进位,否则前面的值先改变,不能进位
24 {
25 result[i+1] += result[i] / 10 ;
26 result[i] %= 10;
27 }
28 }
29 //输出
30 for(i=2*N-1;i>=0;i--)//注意计数变量的自增与自减 ,i的初始值为2倍的再减1
31 {
32 if( result[i] != 0 )
33 break;
34 }
35 for(j=i;j>=1;j--)
36 printf("%d",result[j]);
37 printf("%d
",result[0]);
38 }
39 return 0;
40 }
易错分析:
1、注意数组越界(2*N-1处)