Pagini recente » Cod sursa (job #2641432) | Cod sursa (job #1007681) | Cod sursa (job #1555997) | Cod sursa (job #83795) | Cod sursa (job #1798263)
#include<bits/stdc++.h>
#define pb push_back
using namespace std;
typedef long long ll;
#define fs first
#define sc second
#define mp make_pair
string gb;
int getnum(int st,int dr) {
int ret = 0;
for(int i=st;i<=dr;++i) {
ret *= 10;
ret += (gb[i] -'0');
}
return ret;
}
vector<vector<string>> ops;
inline int is(string &op, int loc,int st,int dr) {
int epos = loc + op.size() - 1;
if(epos > dr) return 0;
int ok = 1;
for(int i=0;i<op.size();++i) {
if(i > dr) return 0;
if(gb[i+loc] != op[i]) ok = 0;
if(!ok) return 0;
}
return 1;
}
inline int make(string &op,int x,int y) {
if(op == "-") return x-y;
if(op == "+") return x+y;
if(op == "/") return x/y;
if(op == "*") return x*y;
}
inline int eval(int st,int dr) {
for(int t = 0;t<ops.size();++t) {
int par = 0;
for(int i = dr;i>=st;--i) {
if(gb[i] == '(') ++ par;
if(gb[i] == ')') -- par;
if(par) continue;
for(auto op : ops[t]) {
if(is(op,i,st,dr)) {
return make(op,eval(st,i-1),eval(i+op.size(),dr));
}
}
}
}
if(gb[st] == '(') {
return eval(st+1,dr-1);
}
return getnum(st,dr);
}
void init() {
ops.pb(vector<string>({"+","-"})); // 4
ops.pb(vector<string>({"/","*"})); // 5
}
int eval(string s) {
gb = "";
for(auto c : s) {
if(c != ' ') gb.pb(c);
}
int ret = eval(0,gb.size()-1);
return ret;
}
int main() {
freopen("evaluare.in","r",stdin);
freopen("evaluare.out","w",stdout);
init();
cin.sync_with_stdio(false);
string s;
getline(cin,s);
cout << eval(s);
return 0;
}