Pagini recente » Cod sursa (job #671102) | Cod sursa (job #375752) | Cod sursa (job #1534854) | Cod sursa (job #963420) | Cod sursa (job #1461667)
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
const int nmx = 100005;
char s[nmx];
void eliminare_paranteze(int &st, int &dr) {
int grad;
bool ok = 1;
while(ok && s[st] == '(' && s[dr] == ')') {
grad = 0;
for(int i = st; i <= dr; ++i)
if(s[i] == '(')
++ grad;
else if(s[i] == ')') {
-- grad;
if(i != dr && not grad) {
ok = 0;
break;
}
}
if(ok) {
++ st;
-- dr;
}
}
}
int eval(int st, int dr) {
eliminare_paranteze(st,dr);
int grad = 0;
/// cauta + -
for(int i = st; i <= dr; ++i){
if(s[i] == '(')
++ grad;
else if(s[i] == ')')
-- grad;
else if(not grad && s[i] == '+')
return eval(st,i-1) + eval(i+1,dr);
else if(not grad && s[i] == '-')
return eval(st,i-1) - eval(i+1,dr);
}
/// cauat * /
for(int i = st; i <= dr; ++i){
if(s[i] == '(')
++ grad;
else if(s[i] == ')')
-- grad;
else if(not grad && s[i] == '*')
return eval(st,i-1) * eval(i+1,dr);
else if(not grad && s[i] == '/')
return eval(st,i-1) / eval(i+1,dr);
}
int rez = 0;
while(s[st] >= '0' && s[st] <= '9'){
rez = rez * 10 + (int)s[st] - 48;
++ st;
}
return rez;
}
int main() {
freopen("evaluare.in", "r", stdin);
freopen("evaluare.out", "w", stdout);
scanf("%s", s);
printf("%d", eval(0,strlen(s)-1));
return 0;
}