結果
問題 | No.708 (+ー)の式 |
ユーザー |
![]() |
提出日時 | 2021-10-27 05:45:00 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 2 ms / 2,000 ms |
コード長 | 2,257 bytes |
コンパイル時間 | 2,120 ms |
コンパイル使用メモリ | 195,556 KB |
最終ジャッジ日時 | 2025-01-25 07:36:27 |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 12 |
ソースコード
#include<bits/stdc++.h>using namespace std;#define rep(i, n) for (ll i = 0; i < (ll)(n); i++)typedef long long ll;typedef vector<ll> vl;typedef vector<vl>vvl;typedef vector<vvl>vvvl;typedef vector<vvvl>vvvvl;typedef vector<vvvvl>vvvvvl;typedef vector<int>vi;typedef vector<vi>vvi;typedef vector<vvi>vvvi;typedef vector<vvvi>vvvvi;typedef vector<vvvvi>vvvvvi;typedef pair<ll,ll> P;typedef string::const_iterator State;ll exp(ll n,ll r){if(r==0)return 1;return n*exp(n,r-1);}// 構文解析template<typename T>struct Parser{bool error;// ヤバイ時trueにParser():error(false){}// 四則演算T expression(string s,int &p){T res=term(s,p);while(p<(int)s.size()){if(s[p]=='+'){p++;res+=term(s,p);continue;}if(s[p]=='-'){p++;res-=term(s,p);continue;}break;}return res;}// 乗除T term(string s,int &p){T res=factor(s,p);while(p<(int)s.size()){if(s[p]=='*'){p++;res*=factor(s,p);continue;}if(s[p]=='/'){p++;T d=factor(s,p);if(d==T(0)){error=true;break;}res/=d;continue;}break;}return res;}// カッコ,数T factor(string &s,int &p){T res;if(s[p]=='('){p++;res=expression(s,p);p++;}else{res=number(s,p);}return res;}// 数,intのみならこれでいい.// int以外の数を受け取る場合は適宜編集することT number(string s,int &p){T res=0;while(p<(int)s.size() and isdigit(s[p])) res=res*10+s[p++]-'0';return res;}T execute(string s){int p=0;error=false;return expression(s,p);}};int main(){Parser<int>ps;string s;cin>>s;cout<<ps.execute(s)<<endl;}