1. 程式人生 > >第十六次 ccf 201903-2 二十四點

第十六次 ccf 201903-2 二十四點

只需要 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 (string
str) { 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 二十四點