PTA L1-025 正整数A+B(团体程序设计天梯赛)

PTA L1-025 正整数A+B

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

输入格式:

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

注意:我们把输入中出现的第1个空格认为是A和B的分隔。题目保证至少存在一个空格,并且B不是一个空字符串。

输出格式:

如果输入的确是两个正整数,则按格式A + B = 和输出。如果某个输入不合要求,则在相应位置输出?,显然此时和也是?。

输入样例1:

 123 456

输出样例1:

123 + 456 = 579

输入样例2:

22. 18

输出样例2:

? + 18 = ?

输入样例3:

-100 blabla bla...33

输出样例3:

? + ? = ?

题目说很简单,信你个鬼了!这道题非常非常非常考验你的细心程度:
主要有三个难点:
1.第一个空格的位置
2.当A或B有值为0时
3.当A或B有值大于1000时

#include<string.h>
#include<iostream>
#include<cmath>
using namespace std;
int judge(char s)//判断字符是否符合规范
{
    if (s<'0' || s>'9') return 0;
	else return 1;
}
int main()
{
	char s[10000];
	int i, k = 0, m = 0, n = 0;
	bool flag1 = 1, flag2 = 1;//判断A与B是否符合规范
	cin.getline(s, 1000);
	for (i = 0; i < strlen(s); i++)
	{
		if (s[i] == ' ') { break; }
		k++;
	}//k分割字符串
	for (i = 0; i < k; i++)
	{
		flag1 = judge(s[i]);
		if (flag1==0) 
		{ break; }
	}//判断A字符串
	for (i = k + 1; i < strlen(s); i++)
	{
		flag2 = judge(s[i]);
		if (!flag2) { break; }
	}//判断B字符串
	if ((k > 4) || (k == 4 && s[k-1]!= '0')) { flag1 = 0; }
	if ((strlen(s) - k - 1 > 4) || ((strlen(s) - k - 1 == 4) && (s[strlen(s) - 1] != '0'))) { flag2 = 0; }//判断A与B是否大于1000,这个小问题导致一个样例怎么也通不过,所以一定要细心
	if (s[0] == '0') flag1 = 0;
	if (s[k + 1] == '0') flag2 = 0;//判断A与B是否为0
	if (!flag1 && !flag2) cout << "? + ? = ?";
	else if (flag1 && !flag2)
	{
		for (i = 0; i < k; i++)
		{
			cout << s[i];
		}
		cout << " + ? = ?";
	}
	else if (!flag1 && flag2)
	{
		cout << "? + ";
		for (i = k + 1; i < strlen(s); i++)
		{
			cout << s[i];
		}
		cout << " = ?";
	}
	else //若A与B都符合规范,则计算和
	{
		for (i = 0; i < k; i++)
		{
			m += pow(10, k - i - 1)*(s[i] - '0');
			cout << s[i];
		}
		cout << " + ";
		for (i = k + 1; i < strlen(s); i++)
		{
			n = n + pow(10, strlen(s) - i - 1)*(s[i] - '0');
			cout << s[i];
		}
		cout << " = " << m + n;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_43765333/article/details/88091531