首页 > 代码库 > 2981 大整数加法

2981 大整数加法

题目来源:
http://bailian.openjudge.cn/practice/2981/
描述
求两个不超过200位的非负整数的和。
输入
有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。
输出
一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
样例输入
22222222222222222222
33333333333333333333
样例输出
55555555555555555555
题意描述:
输入两行都不超过200位的非负整数
计算并输出相加后的结果(去除前导零)
解题思路:
先将str1和str2都逆置(自定义逆置函数或者逆序存储)
取两者较长位数的长度,将短数补齐
一一对应计算
最后去除结果的前导零输出即可
程序代码:

 1 #include<stdio.h>
 2 const int N=230;
 3 #include<string.h>
 4 void strr(char *str); 
 5 int main()
 6 {
 7     char str1[N],str2[N];
 8     int  sum[N],l1,l2,l,i,j;
 9     while(scanf("%s%s",str1,str2)!=EOF)
10     {
11         strr(str1);      
12         strr(str2);
13         l1=strlen(str1); 
14         l2=strlen(str2);
15         if(l1>=l2) 
16         {
17             l=l1;
18             for(i=l2;i<l;i++)
19                 str2[i]=0;
20         }
21         else
22         {
23             l=l2;
24             for(i=l1;i<l;i++)
25                 str1[i]=0;
26         }        
27         if(l==1 && str1[0]==0 && str2[0]==0)
28         {
29             printf("0\n");
30             continue;
31         }
32         
33         memset(sum,0,sizeof(sum));
34         for(i=0;i<l;i++)
35         {
36             sum[i] += str1[i]-0+str2[i]-0;//一一对应-‘0‘ 
37             if(sum[i] > 9)
38             {
39                 sum[i] %= 10;
40                 sum[i+1]++;//进位 
41             }
42         }
43         
44         for(j=i;j>=0;j--)
45             if(sum[j] > 0)//去掉前导零 
46             break;
47           for(i=j;i>=1;i--) 
48               printf("%d",sum[i]);
49         printf("%d\n",sum[i]);
50      } 
51     return 0;
52 }
53 void strr(char *str)
54 {
55     int i,l,t;
56     l=strlen(str);
57     for(i=0;i<l/2;i++){
58         t=str[i];
59         str[i]=str[(l-1)-i];
60         str[(l-1)-i]=t;
61     }
62 }

易错分析:
1、注意0 + 0 的情况,判断时与字符‘0’比较而不是0
2、逆置函数需要自写

2981 大整数加法