PTA团体天梯赛-----L1-025 正整数A+B

题的目标很简单,就是求两个正整数AB的和,其中AB都在区间[1,1000]。稍微有点麻烦的是,输入并不保证是两个正整数。

输入格式:

输入在一行给出AB,其间以空格分开。问题是AB不一定是满足要求的正整数,有时候可能是超出范围的数字、负数、带小数点的实数、甚至是一堆乱码。

注意:我们把输入中出现的第1个空格认为是AB的分隔。题目保证至少存在一个空格,并且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个空格认为是AB的分隔“。因为空格可以做为结束语的不正是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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值