题目要求: 题的目标很简单,就是求两个正整数A和B的和,其中A和B都在区间[1,1000]。稍微有点麻烦的是,输入并不保证是两个正整数。
输入格式: 输入在一行给出A和B,其间以空格分开。问题是A和B不一定是满足要求的正整数,有时候可能是超出范围的数字、负数、带小数点的实数、甚至是一堆乱码。
注意:我们把输入中出现的第1个空格认为是A和B的分隔。题目保证至少存在一个空格,并且B不是一个空字符串。
输出格式: 如果输入的确是两个正整数,则按格式A + B = 和输出。如果某个输入不合要求,则在相应位置输出?,显然此时和也是?。
输入样例1: 123 456 输出样例1: 123 + 456 = 579
解题思路: 字符串操作,判断输入的字符串是否满足题目给出的要求,并分别使用两个变量标记。输出时进行相应判断即可。需要使用到 atoi 函数进行字符串到 int 型数据的转换,以便进行比较和加法运算。
需要注意: 1)输入的数字若超出 [1, 1000] 这个区间,也算是无效的正整数。(踩中的一个坑)。 2)第二个字符串使用 getline 读取时,需要在 getline 前清空一个字符,或者在 getline 后删除字符串的第一个字符。因为这个字符肯定是空格,会影响判断结果。
通关代码:
#include <iostream>
#include <string>
using namespace std;
bool isNum(string str) {
bool flag;
for (string::iterator i = str.begin(); i != str.end(); i++) {
if ((*i > '9' || *i < '0') || (atoi(str.c_str()) > 1000 || atoi(str.c_str()) <= 0)) {
flag = false;
break;
} else {
flag = true;
}
}
return flag;
}
int main() {
string rvalue, lvalue;
bool lIsNum, rIsNum;
cin >> lvalue;
cin.ignore();
getline(cin, rvalue);
if ((lIsNum = isNum(lvalue)) == true) {
cout << lvalue;
} else {
cout << '?';
}
cout << " + ";
if ((rIsNum = isNum(rvalue)) == true) {
cout << rvalue;
} else {
cout << '?';
}
cout << " = ";
if (lIsNum == false || rIsNum == false) {
cout << '?';
return 0;
} else {
cout << atoi(lvalue.c_str()) + atoi(rvalue.c_str());
}
return 0;
}
通关截图: