【題解】ZeroJudge d868: NOIP2000 1.计算器的改良

題目敘述https://zerojudge.tw/ShowProblem?problemid=d868
解題想法:(有很多陷阱要注意)

  • Sample Output的等號是全形,但實際測資是半形。
  • 變數的係數為 1 時(如 1x),可能會寫成 x。
  • -0.000應輸出為 0.000。
  • 小數第4位四捨五入至第3位(不是捨棄第4位)
// 注意:Sample Output的等號是全形,但實際測資是半形
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;

int str2int(string &s, char &op, bool isCoef){
    int ret = 0;
    for (int i=0; i<s.size(); i++){
        ret *= 10;
        ret += s[i] - '0';
    }
    if (isCoef && ret == 0){
        // 變數的係數為 1 時(如 1x),可能會寫成 x。
        ret = 1;
    }
    ret *= (op == '-') ? -1 : 1;
    s = "";
    op = '\0';
    return ret;
}

int main() {
    string s;
    while (cin >> s){
        int sum = 0, coef = 0;
        int idx = -1;
        char var = '\0', op = '\0';
        string num = "";
        while (1){
            idx++;
            if (s[idx] == '=') {
                sum += str2int(num, op, false);
                break;
            } else if (s[idx] == '-'){
                sum += str2int(num, op, false);
                op = '-';
            } else if (s[idx] == '+'){
                sum += str2int(num, op, false);
                op = '+';
            } else if (isalpha(s[idx])){
                coef -= str2int(num, op, true);
                var = s[idx];
            } else {
                num = num + s[idx];
            }
        }
        op = '\0';
        while (idx < s.size()-1){
            idx++;
            if (s[idx] == '-'){
                sum -= str2int(num, op, false);
                op = '-';
            }else if (s[idx] == '+'){
                sum -= str2int(num, op, false);
                op = '+';
            } else if (isalpha(s[idx])){
                coef += str2int(num, op, true);
                var = s[idx];
            } else {
                num = num + s[idx];
            }
        }
        // 式子最後殘餘的數字
        if (num != "") sum -= str2int(num, op, false);
        
        double ans;
        // -0.000應輸出為 0.000。
        if (sum == 0) ans = 0.0;
        else {
            ans = (double)sum / coef;
            // 小數第4位四捨五入至第3位(不是捨棄第4位)
            ans = round(ans * 1000);
            ans /= 1000.0;
        }
        cout << var << "=";
        cout << setprecision(3) << fixed << ans << '\n';
    }
    return 0;
}
分享本文 Share with friends