Pagini recente » romanian_masters | Cod sursa (job #3275755) | Cod sursa (job #2739074)
#include <stdio.h>
#include <bits/stdc++.h>
#define rep(i, n) for(int i = 0; i < (int)(n); i++)
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
ifstream fin {"evaluare.in"};
ofstream fout {"evaluare.out"};
string s;
size_t pos = 0, n;
/*
lvl= 0 (+, -)
lvl= 1 (*, /)
lvl= 2 (\d, ())
*/
const string ops[] = { "+-", "*/", "" };
const int LMAX = 2;
inline int calc(int a, int b, char op) {
int res = 0;
switch(op) {
case '+':
res = a+b; break;
case '-':
res = a-b; break;
case '*':
res = a*b; break;
case '/':
res = a/b; break;
}
return res;
}
int eval(int lvl) {
if (pos >= s.size()) { return 0; /* error */ }
int res = 0;
if (lvl == LMAX) {
if (s[pos] == '(') {
pos++;
res = eval(0);
pos++;
} else {
while(pos < s.size() && '0' <= s[pos] && s[pos] <= '9') {
res = res * 10 + s[pos] - '0';
pos++;
}
}
} else {
res = eval(lvl+1);
while(pos < s.size() && ops[lvl].find(s[pos]) != string::npos) {
char op = s[pos];
pos++;
res = calc(res, eval(lvl+1), op);
}
}
return res;
}
int main(void) {
// freopen("evaluare.in", "r", stdin);
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
fin >> s;
auto ans = eval(0);
fout << ans << "\n";
return 0;
}