Pagini recente » Cod sursa (job #37362) | Cod sursa (job #3129800) | Cod sursa (job #2697458) | Cod sursa (job #2604911) | Cod sursa (job #909541)
Cod sursa(job #909541)
#include <cstdio>
#include <cstring>
#define nMax 100010
using namespace std;
char c[nMax];
int n;
void citire(){
gets(c);
n = strlen(c);
}
int parantezaMare(int st, int dr){
int p = 1;
int i = st + 1;
for(; p; ++ i){
if(c[i] == '('){
p ++;
}
if(c[i] == ')'){
p--;
}
}
return !p && i >= dr;
}
void sari(int &i){
int p = 1;
i --;
while(p){
if(c[i] == '('){
p --;
}
if(c[i] == ')'){
p ++;
}
i --;
}
i ++;
}
int eval(int st, int dr){
if(c[st] == '(' && c[dr - 1] == ')'){
if(parantezaMare(st,dr)){
return eval(st + 1, dr - 1);
}
}
for(int i = dr - 1; i >= st; -- i){
if(c[i] == ')'){
sari(i);
continue;
}
if(c[i] == '+'){
return eval(st, i) + eval(i + 1, dr);
}
if(c[i] == '-'){
return eval(st, i) - eval(i + 1, dr);
}
}
for(int i = dr - 1; i >= st; -- i){
if(c[i] == ')'){
sari(i);
continue;
}
if(c[i] == '*'){
return eval(st, i) * eval(i + 1, dr);
}
if(c[i] == '/'){
return eval(st, i) / eval(i + 1, dr);
}
}
int x = 0;
for(int i = st; i < dr; ++ i){
x = x * 10 + (c[i] - '0');
}
return x;
}
int main()
{
freopen("evaluare.in", "r", stdin);
freopen("evaluare.out", "w", stdout);
citire();
printf("%d\n", eval(0, n));
return 0;
}