Pagini recente » Cod sursa (job #354018) | Istoria paginii runda/havesomefun2/clasament | Istoria paginii runda/aib | Cod sursa (job #2049086) | Cod sursa (job #1480212)
#include <fstream>
#include <string>
using namespace std;
ifstream f("evaluare.in");
ofstream o("evaluare.out");
const int nmx = 100005;
string s;
inline int numar(const int st, const int dr) {
static int aux;
aux = 0;
for(int i = st; i <= dr; ++i) {
aux *= 10;
aux += (int)s[i] - 48;
}
return aux;
}
void eliminare_paranteze(int &st, int &dr) {
static int grad;
static bool ok;
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) {
static int parant;
eliminare_paranteze(st,dr);
parant = 0;
for(int i = dr; i >= st; --i) {
if(s[i] == ')')
++ parant;
else if(s[i] == '(')
-- parant;
if(s[i] == '+' && not parant)
return eval(st,i-1) + eval(i+1,dr);
else if(s[i] == '-' && not parant)
return eval(st,i-1) - eval(i+1,dr);
}
parant = 0;
for(int i = dr; i >= st; --i) {
if(s[i] == ')')
++ parant;
else if(s[i] == '(')
-- parant;
if(s[i] == '*' && not parant)
return eval(st,i-1) * eval(i+1,dr);
else if(s[i] == '/' && not parant)
return eval(st,i-1) / eval(i+1,dr);
}
return numar(st,dr);
}
int main() {
f >> s;
o << eval(0,s.size()-1);
return 0;
}