正整数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:
- 18
输出样例2:
? + 18 = ?
输入样例3:
-100 blabla bla…33
输出样例3:
? + ? = ?
分析:此题看似简单,实则有很多坑,测试点有很多。除样例1,2,3外,还需考虑
- 数字范围问题,[1,1000]范围外也要输出?;(测试点5,6,非正常边界)
- 空格问题,B如果是空格,输出?;A是空格,计为0;(题意“并且B不是一个空字符串”)
知识点:
切子串:
s1 = s.substr(0, a); //0为其实下标,a为从下标开始的字符个数
将字符串转化为数字:
n1 = atoi(s1.c_str());
思路:将输入的一行作为一个字符串s,第一个子串为s1,对应数字记为n1(若不是整数或超出范围记为-1);第二个为s2,对应数字记为n2(与n1同理)。第一个空格下标为a,第二个空格下标为b。
首先找空格的下标,若有多个空格,则第一个空格为分割点,故遍历;若存在超过一个空格,标记n2 = -1
,若只存在一个空格,则b = s.length()
;
for(i = 0;i < s.length();i++)
{
if(s[i] == ' ')
{
b = i;
k++;
}
if(k >= 2)//有两个空格,无论是B为空格还是B为xxx xx的样式,B都要输出?
{
n2 = -1;
break;
}
a = b;
}
if(k == 1)//只有一个空格,xxx xxx格式
b = s.length();
接着,判断两部分子串是否符合要求,若不符合,记n1或n2为-1
for(i = 0;i < a;i++)
{
if(s[i] < '0' || s[i] > '9')
{
n1 = -1;
break;
}
}
for(i = a+1;i < b;i++)
{
if(s[i] < '0' || s[i] > '9')
{
n2 = -1;
break;
}
}
接下来就可以分情况讨论输出了,在此不单独列出,请看完整AC代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s, s1, s2;
int n1 = 0, n2 = 0, i, k = 0, a, b;
getline(cin, s);
for(i = 0;i < s.length();i++)
{
if(s[i] == ' ')
{
b = i;
k++;
}
if(k >= 2)//有两个空格,无论是B为空格还是B为xxx xx的样式,B都要输出?
{
n2 = -1;
break;
}
a = b;
}
if(k == 1)//只有一个空格,xxx xxx格式
b = s.length();
for(i = 0;i < a;i++)
{
if(s[i] < '0' || s[i] > '9')
{
n1 = -1;
break;
}
}
for(i = a+1;i < b;i++)
{
if(s[i] < '0' || s[i] > '9')
{
n2 = -1;
break;
}
}
if(n1 != -1 && n2 != -1)
{
s1 = s.substr(0, a);
s2 = s.substr(a+1, b-a-1);
n1 = atoi(s1.c_str());
n2 = atoi(s2.c_str());
if(n1 >= 1 && n1 <= 1000 && n2 >= 1 && n2 <= 1000)
printf("%d + %d = %d", n1, n2, n1+n2);
else if(n1 >= 1 && n1 <= 1000 &&(n2 < 1 || n2 >1000))
printf("%d + ? = ?", n1);
else if(n2 >= 1 && n2 <= 1000 &&(n1 < 1 || n1 >1000))
printf("? + %d = ?", n2);
else
printf("? + ? = ?");
}
else if(n1 == -1 && n2 != -1)
{
s2 = s.substr(a+1, b-a-1);
n2 = atoi(s2.c_str());
if(n2 >= 1 && n2 <= 1000)
printf("? + %d = ?", n2);
else
printf("? + ? = ?");
}
else if(n1 != -1 && n2 == -1)
{
s1 = s.substr(0, a);
n1 = atoi(s1.c_str());
if(n1 >= 1 && n1 <= 1000)
printf("%d + ? = ?", n1);
else
printf("? + ? = ?");
}
else
printf("? + ? = ?");
return 0;
//数字范围问题,测试点5,6,非正常边界测试
//0 2,测试点5
}