题目的主要信息:
- 输入一个字符串,格式:运算方式 整数1 整数2
- 编写程序解析出字符串中的 3 部分内容,然后做相应的运算,并输出结果
- 计算为整数1操作符整数2,除法不考虑小数,除数为0输出“Error”
- 运算方式的add、sub、div、mul忽略大小写
具体做法:
这道题主要思路是先从字符串中识别运算符和两个整数,然后根据运算符进行相应的计算。
题目所给的代码中,输入的字符串是一个字符数组,采用getline函数输入,这样会在输入的末尾增加一个'\0'表示字符串的结束,如果长度小于数组长度,输入所有字符后加'\0',如果长度大于数组长度,截断输入的前面部分再在最后加'\0'。我们从字符数组起始遍历到'\0',统计遇到空格数,第一个空格之前的,我们添加到字符操作符op(string类型)中,第一个空格到第二个空格之间的我们添加到第一个整数字符串(string类型)中,第二个空格之后的我们添加到第二个整数字符串(string类型)中。
然后利用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;
}
复杂度分析:
- 时间复杂度:,字符串长度为常数级,计算也是常数时间
- 空间复杂度:,无额外空间