题目 1073: 弟弟的作业()

的弟弟刚做完了“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_offind来查找找字符。

(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
#include
#include
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; // 输出答对的题目数量
}

你可能感兴趣的:(算法)