其實這道題不難,但很多同學空着只寫了個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;
}
}
}