第十六次 ccf 201903-2 二十四點
阿新 • • 發佈:2019-03-24
只需要 ack 連續 () break int sin pre mes
這道題只有7個字符,數字只有一位不算太難
先算乘除,後算加減,考試的時候就是這樣做的,用stack完美解決
但如果加大難度....
1) 數字允許有多位比如 1314-521*233
2) 再比如如果有括號呢 -1-(1-(-9))
讓我們按照函數化的思想逐漸完善我們的代碼
(1) 7個字符版本
#include <iostream> #include <algorithm> #include <stack> using namespace std; int get_ans (stringstr) { stack <int> s; int flag=1; for (int i=0;i<str.size();i++) { if (str[i]>=‘0‘&&str[i]<=‘9‘) s.push( flag*(str[i]-‘0‘)); else if (str[i]==‘-‘ || str[i]==‘+‘) { if (str[i]==‘-‘) flag=-1; else flag=1; }
#include <iostream> #include <algorithm> #include <stack> using namespace std; int get_num(string str,int &k) { // 從k開始一直讀所有的數字字符 int ans=0; for (;k<str.size();k++) { if (str[k]>=‘0‘ && str[k]<=‘9‘) ans=ans*10+str[k]-‘0‘; else break; } k--; // i 此時指向最後一個數字的位置 return ans; } int get_ans (string str) { stack <int> s; int flag=1; for (int i=0;i<str.size();i++) { if (str[i]>=‘0‘&&str[i]<=‘9‘) { int num=get_num(str,i); s.push(flag*num); } else if (str[i]==‘-‘ || str[i]==‘+‘) { if (str[i]==‘-‘) flag=-1; else flag=1; } else { char ch=str[i]; int x1=s.top(); s.pop(); i++; int x2=get_num(str,i); if (ch==‘/‘) s.push(x1/x2); else s.push(x1*x2); } } int sum=0; while (!s.empty()) { sum+=s.top(); s.pop(); } return sum; } int main () { int T; cin>>T; while (T--) { string str; cin>>str; cout<<get_ans(str)<<endl; } return 0; }
int x1=s.top(); s.pop(); i++; // importment !! int x2=str[i]-‘0‘; if (str[i-1]==‘/‘) s.push(x1/x2); else s.push(x1*x2); } } int sum=0; while (!s.empty()) { sum+=s.top(); s.pop(); } return sum; } int main () { int T; cin>>T; while (T--) { string str; cin>>str; cout<<get_ans(str)<<endl; } return 0; }
允許輸入連續的數字233, 我們只需要加一個輸入接口
第十六次 ccf 201903-2 二十四點