2980 大整數乘法
阿新 • • 發佈:2017-05-21
沒有 程序代碼 pre != return 註意 string str1 改變
題目來源:
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\n",result[0]);
38 }
39 return 0;
40 }
易錯分析:
1、註意數組越界(2*N-1處)
2980 大整數乘法