Pagini recente » Cod sursa (job #1663869) | Istoria paginii runda/pregatireoni-cls5/clasament | Cod sursa (job #137044) | Cod sursa (job #126025) | Cod sursa (job #1900450)
#include <cstdio>
#include <cstring>
using namespace std;
char s[200000];
int poz, n;
int numar();
int parant();
int numar() {
if (s[poz] == '(') {
++poz;
return parant();
}
int val = 0;
while (s[poz] >= '0' && s[poz] <= '9' && poz < n) {
val = val * 10 + s[poz] - '0';
++poz;
}
return val;
}
inline int ec (int a, int b, char s) {
switch (s) {
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
case '/':
return a / b;
}
}
int parant() {
int a, b, c;
char s1, s2;
a = numar();
if (poz == n || s[poz] == ')') {
++poz;
return a;
}
s1 = s[poz];
++poz;
b = numar();
if (poz == n || s[poz] == ')') {
++poz;
return ec (a, b, s1);
}
while (poz != n && s[poz] != ')') {
s2 = s[poz];
++poz;
c = numar();
if (s1 == '*' || s1 == '/') {
a = ec (a, b, s1);
b = c;
s1 = s2;
} else {
if (s2 == '*' || s2 == '/')
b = ec (b, c, s2);
else {
a = ec (a, b, s1);
b = c;
s1 = s2;
}
}
}
a = ec (a, b, s1);
++poz;
return a;
}
int main() {
freopen ("evaluare.in", "r", stdin);
freopen ("evaluare.out", "w", stdout);
gets (s);
n = strlen (s);
printf ("%d", parant());
return 0;
}