Yukicoder049 算数の宿題

問題概要

太郎君の国では、足し算は$*$の記号で、また、掛け算は$+$の記号で表されます。 また、足し算と掛け算に優先度はなく、左から順番に計算します。 これを計算せよ。

$|S|\leqq10^2$

yukicoder049

解法

構文解析をしっかり書く必要はなくて、状態遷移していけば良い。

計算量:$O(|S|)$

ソース

    #include <bits/stdc++.h>
    using namespace std;
    
    using VS = vector<string>;    using LL = long long;
    #define SZ(a) int((a).size())
    #define FOR(i, s, e) for (int(i) = (s); (i) < (e); (i)++)
    
    LL N;
    LL ans = 0LL;
    
    int main() {
        cin.tie(0);
        ios_base::sync_with_stdio(false);
    
        string s; cin >> s;
        LL ret = 0, sub = 0;
        int mode = 0;
        FOR(i, 0, SZ(s)) {
            if (isdigit(s[i])) {
                sub *= 10;
                sub += s[i] - '0';
            }
            else {
                if (mode == 1) { // +
                    ret += sub;
                }
                else if (mode == 2) {
                    ret *= sub;
                }
                else {
                    ret = sub;
                }
    
                sub = 0;
                if (s[i] == '+') {
                    mode = 2;
                }
                else {
                    mode = 1;
                }
            }
        }
    
        if (mode == 1) { // +
            ret += sub;
        }
        else if (mode == 2) {
            ret *= sub;
        }
        else {
            ret = sub;
        }
        ans = ret;
    
        cout << ans << "\n";
    
        return 0;
    }
Share Comments
̃Gg[͂ĂȃubN}[Nɒlj
comments powered by Disqus