标签:字符 情况 break include ring 去除 来源 strlen sizeof
题目来源:
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、逆置函数需要自写
标签:字符 情况 break include ring 去除 来源 strlen sizeof
原文地址:http://www.cnblogs.com/wenzhixin/p/6883494.html