2980 大整数乘法

Posted Reqaw’s Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2980 大整数乘法相关的知识,希望对你有一定的参考价值。

题目来源:
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 大整数乘法的主要内容,如果未能解决你的问题,请参考以下文章

大整数乘法运算

caioj1450:快速傅里叶变换大整数乘法

大整数乘法问题

模板整理~~~~~大整数乘法

大整数加法和大整数乘法

[转]大整数算法[11] Karatsuba乘法