码迷,mamicode.com
首页 > 其他好文 > 详细

2980 大整数乘法

时间:2017-05-21 00:26:46      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:for   const   break   数组越界   否则   输出   include   结果   分析   

题目来源:
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 大整数乘法

标签:for   const   break   数组越界   否则   输出   include   结果   分析   

原文地址:http://www.cnblogs.com/wenzhixin/p/6883607.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!