的弟弟刚做完了“100以内数的加减法”这部分的作业,请你帮他检查一下。每道题目(包括弟弟的答案)的格式为a+b=c或者a-b=c,其中a和b是作业中给出的,均为不超过100的非负整数;c是弟弟算出的答案,可能是不超过200的非负整数,也可能是单个字符"?",表示他不会算。
输入格式
输入文件包含不超过100行,以文件结束符结尾。每行包含一道题目,格式保证符合上述规定,且不包含任何空白字符。输入的所有整数均不含前导0。
输出格式
输出仅一行,包含一个非负整数,即弟弟答对的题目数量。
样例输入
1+2=3
3-1=5
6+7=?
99-0=99
个人解析(别人的代码):
在这里假设给出的第一个式子是:99-0=98,我们需要做的是把99,0和98分割出来,但是我们怎么切割呢?一会儿是99的两个数,一会是一个数的0
有没有什么元素是在式子中不变的呢?聪明的你一下就和我找到了,“我知道我知道!加号和减号,还有等号在式子中是不变的!”
这里我们利用string类的内置函数 find_first_of和find来查找找字符。
(1)其中find_first_of只要要查找的字符串中含有任意字符就能成功,所以我们写的是:pos1 = str.find_first_of("+-") 只要“+”或“-”查找到了即可,
(2)而后者find不一样,要全部字符,所以这里我们用:pos2 = str.find('='); 查找到等号的位置。
substr函数:提取字符串的一部分。 substr () 方法从指定位置开始,并返回指定数量的字符
之后我们通过加号“+”或者减号“-”将取得的字符分离出数字,从0到pos1是数字1,从pos1到pos2(等号)是数字2,从pos2之后的就是剩下的给出的数字3
已经分离出了三个数字,进行正确答案的检验,num1+num2?=num3即可
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
// 将字符串转换为整数
int toInt(string s) {
int ret;
stringstream stream(s);
stream >> ret;
return ret;
}
int main() {
string str;
int sum = 0;
while (cin >> str) { // 逐行读取输入
int a = 0, b = 0, c = 0;
string::size_type pos1, pos2;
pos1 = str.find_first_of("+-"); // 找到“+”或“-”位置
pos2 = str.find('='); // 找到等号的位置
a = toInt(str.substr(0, pos1)); // 取得表达式中的第一个操作数
b = toInt(str.substr(pos1, pos2)); // 取得表达式中的第二个操作数
c = toInt(str.substr(pos2 + 1)); // 取得表达式中的答案
if (a + b == c) { // 判断弟弟计算的结果是否正确
sum += 1; // 答对的题目数量+1
}
}
cout << sum << endl; // 输出答对的题目数量
}