目录
一、问题描述
题的目标很简单,就是求两个正整数A
和B
的和,其中A
和B
都在区间[1,1000]。稍微有点麻烦的是,输入并不保证是两个正整数。
1. 输入格式
输入在一行给出A
和B
,其间以空格分开。问题是A
和B
不一定是满足要求的正整数,有时候可能是超出范围的数字、负数、带小数点的实数、甚至是一堆乱码。
注意:我们把输入中出现的第1个空格认为是A
和B
的分隔。题目保证至少存在一个空格,并且B
不是一个空字符串。
2. 输出格式
如果输入的确是两个正整数,则按格式A + B = 和
输出。如果某个输入不合要求,则在相应位置输出?
,显然此时和也是?
。
3. 输入样例
123 456
4. 输出样例
123 + 456 = 579
5. 限制条件
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
栈限制 8192 KB
二、问题分析
1. 依次遍历字符串,遇到第一个空格时停止,并检查第一个数字是否合法;
2. 继续遍历字符串,遇到第二个空格时停止,并检查第二个数字是否合法;
3. 为防止第二个数字后还有多余的字符,应同时判断此时是否遍历完所有字符。
三、源码解答
#include<iostream>
#include<string>
using namespace std;
int main(){
string ss, num1 = "", num2 = "";
getline(cin, ss);
int len = ss.size(), k = 0;
//判断两个数是否合法
int flag1 = 1, flag2 = 1;
//取第一个数, 同时判断是否合法
for(k; k < len; ++k) {
if(ss[k] == ' ') break;
if(ss[k] < '0' || ss[k] > '9') {
flag1 = 0;
}
else {
num1 += ss[k];
}
}
//取第二个数, 同时判断是否合法
for(k = k + 1; k < len; ++k) {
if(ss[k] == ' ') break;
if(ss[k] < '0' || ss[k] > '9') {
flag2 = 0;
}
else {
num2 += ss[k];
}
}
//因为题目要求在[1,1000]之内
flag1 = (flag1 && stoi(num1) >= 1 && stoi(num1) <= 1000) ? flag1 : 0;
flag2 = (flag2 && stoi(num2) >= 1 && stoi(num2) <= 1000) ? flag2 : 0;
//以防第二个数后还有多余的字符
flag2 = flag2 && (k >= ss.size());
if(flag1) cout << stoi(num1) << " + ";
else cout << "? + ";
if(flag2) cout << stoi(num2) << " = ";
else cout << "? = ";
if(flag1 && flag2) {
cout << stoi(num1) + stoi(num2) << endl;
}
else {
cout << "?";
}
return 0;
}