题的目标很简单,就是求两个正整数A
和B
的和,其中A
和B
都在区间[1,1000]。稍微有点麻烦的是,输入并不保证是两个正整数。
输入格式:
输入在一行给出A
和B
,其间以空格分开。问题是A
和B
不一定是满足要求的正整数,有时候可能是超出范围的数字、负数、带小数点的实数、甚至是一堆乱码。
注意:我们把输入中出现的第1个空格认为是A
和B
的分隔。题目保证至少存在一个空格,并且B
不是一个空字符串。
输出格式:
如果输入的确是两个正整数,则按格式A + B = 和
输出。如果某个输入不合要求,则在相应位置输出?
,显然此时和也是?
。
样例1:">输入样例1:
123 456
输出样例1:
123 + 456 = 579
输入样例2:
22. 18
输出样例2:
? + 18 = ?
输入样例3:
-100 blabla bla...33
输出样例3:
? + ? = ?
<1>这个题的开始就很关键,如果你选择gets两个字符数组的话,空格很难处理,但题目里的一句话给了我们启发: ”我们把输入中出现的第1个空格认为是A
和B
的分隔“。因为空格可以做为结束语的不正是scanf(”%s“,s)吗?所以我们可以先scanf前面的字符串,再gets后面部分字符串!
<2>而按照上面输入的话,输入的空格就算进了后面字符数组中,所以后面部分字符数组的第一个字符是空格,这个要特别注意!因为对后面判断第一个数字是否为0很重要!
<3>中间部分不仅出现非数字字符是非法的,而且01,04,045,0012等数字也是非法的,所以我们要判断第一个数字是否为0!
<4>题目中还说A与B都是不超过1000的数,所以我们还要把1000作为一个判断非法的标准!
说了以上的注意点后,这道题就变得很简单了,我们来看一看具体代码如何操作:
#include <stdio.h>
#include <string.h>
int main(void)
{
char a[1001];//这里已空格结束,但这个空格算进了b中,这点要注意。
char b[1001];
int i,j,x1 = 1,x2 = 1;
scanf("%s",a);//用scanf输入a是为了在空格时将前后分开。
gets(b);
int flag1 = 0;//记录前半部分是否符合要求。
int flag2 = 0;//记录后半部分是否符合要求。
int sum1 = 0;//记录前半部分的数字
int sum2 = 0;//记录后半部分数字
int l1 = strlen(a);
int l2 = strlen(b);
for(i=l1-1; i>=0; --i)//已知长度,倒着记录方便计数。
{
if(a[i] >= '0' && a[i] <= '9')
{
sum1 += (a[i] - '0') * x1;
x1*=10;
if(sum1 > 1000||a[0] == '0')//这个a【0】的情况容易忽略
{
flag1 = 1;
}
}
else
{
flag1 = 1;
}
}
for(j=l2-1; j>=1; --j)//已知长度,倒着记录方便计数。
//注意*这里的j与前面的i不同,这里不能是0,因为b【0】是空格。
{
if(b[j] >= '0' && b[j] <= '9')
{
sum2 += (b[j] - '0')* x2;
x2*=10;
if(sum2 > 1000||b[1] == '0')//这个b【1】的情况容易忽略
{
flag2 = 1;
}
}
else
{
flag2 = 1;
}
}
if(flag1 == 0 && flag2 == 1)
{
printf("%d + ? = ?\n",sum1);
}
else if(flag1 == 1 && flag2 == 0)
{
printf("? + %d = ?\n",sum2);
}
else if(flag1 == 1 && flag2 == 1)
{
printf("? + ? = ?\n");
}
else if(flag1 == 0 && flag2 == 0)
{
printf("%d + %d = %d\n",sum1,sum2,sum1+sum2);
}
return 0;
}