题目的主要信息:

  • 输入一个字符串,格式:运算方式 整数1 整数2
  • 编写程序解析出字符串中的 3 部分内容,然后做相应的运算,并输出结果
  • 计算为整数1操作符整数2,除法不考虑小数,除数为0输出“Error”
  • 运算方式的add、sub、div、mul忽略大小写

具体做法:

这道题主要思路是先从字符串中识别运算符和两个整数,然后根据运算符进行相应的计算。

题目所给的代码中,输入的字符串是一个字符数组,采用getline函数输入,这样会在输入的末尾增加一个'\0'表示字符串的结束,如果长度小于数组长度,输入所有字符后加'\0',如果长度大于数组长度,截断输入的前面部分再在最后加'\0'。我们从字符数组起始遍历到'\0',统计遇到空格数,第一个空格之前的,我们添加到字符操作符op(string类型)中,第一个空格到第二个空格之间的我们添加到第一个整数字符串(string类型)中,第二个空格之后的我们添加到第二个整数字符串(string类型)中。

alt

然后利用stoi函数将两个整数字符串转变成int型整数。

然后我们利用strcasecmp函数比较大小,strcasecmp函数是可以忽略大小写的字符串比较方式,我们将操作符字符串op分别与"add"、"sub"、"mul"、"div"比较,如果结果为0,表示二者相等,当然strcasecmp函数不支持string类型的字符串,因此我们还需要将其用c_str()函数转变成C型字符串。

找到相应的操作符,我们就输出相应的加减乘除结果,其中除法需要判断除数即第二个整数是否为0,如果为0需要输出"Error"。

#include <iostream>
#include <string.h>
#include <string>
#include <cstdlib>
using namespace std;

int main() {

	char str[100] = { 0 };
	cin.getline(str, sizeof(str));
    string op = "";
    string num1 = "";
    string num2 = "";
    int space = 0;
    for(int i = 0; str[i] != '\0'; i++){
        if(str[i] == ' '){
            space++;
            continue;
        }
        else if(space == 0) //第一空格之前都是操作符
            op += str[i]; 
        else if(space == 1) //第一二个空格之间,为第一个数字
            num1 += str[i];
        else if(space == 2)
            num2 += str[i]; //第二个空格之后,为第二个数字
    }
    int x = stoi(num1); //字符串转数组
    int y = stoi(num2);
  //分情况计算加减乘除
    if(strcasecmp(op.c_str(), "add") == 0)
        cout << x + y << endl;
    else if(strcasecmp(op.c_str(), "sub") == 0)
        cout << x - y << endl;
    else if(strcasecmp(op.c_str(), "mul") == 0)
        cout << x * y << endl;
    else if(strcasecmp(op.c_str(), "div") == 0){
        if(y == 0) //除数为0
            cout << "Error" << endl;
        else
            cout << (double) x / y << endl;
    }
	return 0;
}

复杂度分析:

  • 时间复杂度:O(1)O(1),字符串长度为常数级,计算也是常数时间
  • 空间复杂度:O(1)O(1),无额外空间