其实这道题不难,但很多同学空着只写了个main(),让我感到很惊讶!
步骤:首先得定义一个去空格的函数,再有一个判断格式错误的函数,然后才是计算。计算已经很简单,去掉了除(/)这种情况,而且将操作数定义为1~9的正整数。
难点:istringstream字符串输入流用法
刚开始想利用char转int来做,但发现时间复杂度会超时。使用istringstream可以解决这个问题,再定义两个vector分别存放操作数和符号
PS: zjut1034题很像,只是多了去除空格,和格式判断
链接:http://cpp.zjut.edu.cn/ShowProblem.aspx?ShowID=1034
附上源代码(C++):
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
string Space_Remove(string str){ // 去除空格
string re_str;
for(int i=0;i<str.length();i++){
if(str[i] != ' '){re_str += str[i];}
}
return re_str;
}
bool Format_Check(string str){ // 检查输入格式
bool flag = true;
for(int i=0;i<str.length();i=i+2){
if(str[i]<'1' || str[i]>'9'){flag = false;break;}
}
for(int i=1;i<str.length()-1;i=i+2){
if(str[i]!='*' && str[i]!='-' && str[i]!='+' && str[i]!='/'){flag = false;break;}
}
return flag;
}
void main(){
string str;
while(getline(cin,str)){
str = Space_Remove(str);
cout<<str<<endl;
if(!Format_Check(str)){cout<<"#\n";}
else {
istringstream sin(str); // 定义一个istringstream(字符串输入流)对象sin,并将str的值存储在sin中
vector<int> num;
vector<char> sign;
char ch;
int a;
sin>>a; // 字符串的读取,只读取整数,遇到符号停止读取
num.push_back(a);
while(sin>>ch>>a){ // 先计算"*" 和 "/"
if(ch=='*'){
num.back() *= a;
}
else if(ch=='/'){
if(a!=0){num.back() /= a;} // 因为a取1~9,所以被除数为0不用考虑
else {cout<<"error!\n";exit(0);}
}
else {
num.push_back(a);
sign.push_back(ch);
}
}
int sum = num[0];
for(int i=0;i<sign.size();i++){ // 后计算"+" 和 "-"
if(sign[i]=='+'){sum += num[i+1]; }
else {sum -= num[i+1];}
}
cout<<sum<<endl;
}
}
}