srupのメモ帳

競プロで解いた問題や勉強したことを記録していくメモ帳

yukicoder No.49 算数の宿題

問題

問題概要

文字列を数式ととらえて、計算していく、構文解析の問題。

解法

*,+が出てくるまで、いくつ数字が並んでいるかを確認した後、数字の並びの前に出ていた記号によって、数字を足すのか、かけるのかの処理を行えばいい。ただ、実装が少しめんどくさい。

ミス

なんかバグを生みまくるコードを書いてしまった。

コード

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;

int main(void){
    string s; cin >> s;
    long long ans = 0;
    int memo = 0;//0 = (*) 1 = (+)
    for (int l = 0; l < s.size(); ++l){
        double cnt = -1;
        int now = 0;
        int r;

        for (r = l; r < s.size(); ++r){
            if(s[r] == '*' || r == s.size() - 1){
                if(r != s.size() - 1){
                    for (int i = l; i < r; ++i){
                        now += (s[i] - '0')    * pow(10, cnt);
                        cnt--;
                    }
                }else{
                    for (int i = l; i <= r; ++i){
                        now += (s[i] - '0')    * pow(10, cnt + 1);
                        cnt--;
                    }
                }
                if(memo == 0) ans += now;
                else ans *= now;
                memo = 0;
                break;

            }else if(s[r] == '+' || r == s.size() - 1){
                if(r != s.size() - 1){
                    for (int i = l; i < r; ++i){
                        now += (s[i] - '0')    * pow(10, cnt);
                        cnt--;
                    }
                }else{
                    for (int i = l; i <= r; ++i){
                        now += (s[i] - '0')    * pow(10, cnt + 1);
                        cnt--;
                    }
                }
                if(memo == 0) ans += now;
                else ans *= now;
                memo = 1;
                break;
            }
            cnt++;  
        }
        l = r;
    }
    printf("%lld\n", ans);
    return 0;
}