結果
問題 | No.708 (+ー)の式 |
ユーザー |
![]() |
提出日時 | 2023-06-20 23:41:31 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 10 ms / 2,000 ms |
コード長 | 2,628 bytes |
コンパイル時間 | 2,047 ms |
コンパイル使用メモリ | 195,716 KB |
最終ジャッジ日時 | 2025-02-14 23:43:45 |
ジャッジサーバーID (参考情報) |
judge3 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 12 |
ソースコード
#include <bits/stdc++.h>using namespace std;#define rep(i, n) for (long long i = 0; i < (long long)(n); i++)#define repn(i,end) for(long long i = 0; i <= (long long)(end); i++)#define reps(i,start,end) for(long long i = start; i < (long long)(end); i++)#define repsn(i,start,end) for(long long i = start; i <= (long long)(end); i++)#define ll long long#define ld long double#define print(t) cout << t << endl#define all(a) (a).begin(),(a).end()// << std::fixed << std::setprecision(0)const ll INF = 1LL << 60;template<class T> bool chmin(T& a, T b){if(a > b){a = b;return true;}return false;}template<class T> bool chmax(T& a, T b){if(a < b){a = b;return true;}return false;}ll lpow(ll x,ll n){ll ans = 1;while(n >0){if(n & 1)ans *= x;x *= x;n >>= 1;}return ans;}typedef string::const_iterator State;class ParseError {};//プロトタイプ宣言ll expression(State &begin);ll term(State &begin);ll number(State &begin);ll factor(State &begin);void consume(State &begin, char expected);//四則演算の式を構文解析し評価結果を返す。ll expression(State &begin){ll ret = term(begin);for(;;){if(*begin == '+'){begin++;ret += term(begin);}else if(*begin == '-'){begin++;ret-= term(begin);}else {break;}}return ret;}// 乗除算の式を構文解析し評価結果を返す。ll term(State &begin){ll ret = factor(begin);for(;;){if(*begin == '*'){begin++;ret *=factor(begin);}else if(*begin == '/'){begin++;ret /= factor(begin);}else{break;}}return ret;}//数字の列を構文解析してその数を返す。ll number(State &begin){ll ret = 0;while(isdigit(*begin)){ret *= 10;ret += *begin - '0';begin++;}return ret;}//カッコが含まれるならそれを飛ばす処理を行うll factor(State &begin){if(*begin == '('){consume(begin,'(');ll ret = expression(begin);consume(begin,')');return ret;}else {return number(begin);}}void consume(State &begin, char expected){if(*begin == expected){begin++;}else{cerr << "Expected '" << expected << "' but got '" << *begin << "'" << endl;cerr << "Rest string is '";while(*begin){cerr << *begin++;}cerr << "'" << endl;throw ParseError();}}int main(){string s;cin >> s;s += '=';State begin = s.begin();ll ans = expression(begin);consume(begin,'=');cout << ans << endl;}