Pagini recente » Cod sursa (job #1466116) | Cod sursa (job #679672) | Cod sursa (job #1875078) | Cod sursa (job #2888297) | Cod sursa (job #156486)
Cod sursa(job #156486)
#include <cstdio>
#include <iostream>
//#include <ctype.h>
#include <map>
#include <string>
using namespace std;
#define nm 256
#define pb push_back
map <string, string> H;
char s1[nm];
string s, s2;
int sol, i, p, n;
int exp();
int getnr();
string find(string u)
{
if (H.find(u) == H.end()) return u;
H[u] = find(H[u]);
return H[u];
}
int pow(int x, int y)
{
int aux;
if (y == 0)
return 1;
if (y & 1)
return (x * pow(x, y-1));
else
aux = pow(x, y/2);
return aux*aux;
}
int transf(string ret)
{
int i;
for (i=0; i<ret.size(); ++i)
{
if (ret[i] < '0' || ret[i] > '9')
return 0;
}
int ret2 = 0;
for (i=0; i<ret.size(); ++i)
{
ret2 = ret2 *10 + ret[i] - '0';
}
return ret2;
}
int getnr()
{
string ret2;
while ((s2[p] >= '0' && s2[p] <= '9') || (s2[p] >= 'a' && s2[p] <= 'z') || (s2[p] >= 'A' && s2[p] <= 'Z'))
{
ret2.pb(s2[p]);
++ p;
}
if (H.find(ret2) != H.end())
return transf(find(ret2));
return transf(ret2);
}
int fact()
{
int ret = 0, x = 1;
if (s2[p] == '+' || s2[p] == '-')
{
x = 1;
if (s2[p] == '-')
x = 2;
++p;
}
if (s2[p] == '(')
{
++p;
ret = exp();
++p;
}
else ret = getnr();
if (x == 2)
ret *= -1;
if (s2[p] == '^' && p < n)
{
++p;
int ret2;
ret2 = fact();
ret = pow(ret, ret2);
}
return ret;
}
int ter()
{
int ret = fact(), ret1, sm1, sm2;
int x;
while (p < n && (s2[p] == '*' || s2[p] == '/' || s2[p] == '%'))
{
x = 1;
if (s2[p] == '/')
x = 2;
else
if (s2[p] == '%')
x = 3;
++p;
if (x == 1)
ret *= fact();
else
if (x == 2)
{
sm1 = 1;
if (ret < 0)
{
sm1 = 0;
ret *= -1;
}
ret1 = fact();
sm2 = 1;
if (ret1 < 0)
{
sm2 = 0;
ret1 *= -1;
}
ret /= ret1;
if (sm1 != sm2)
{
ret *= -1;
}
}
else
if (x == 3)
{
sm1 = 1;
if (ret < 0)
{
sm1 = 0;
ret *=-1;
}
ret1 = fact();
sm2 = 1;
if (ret1 < 0)
{
sm2 = 0;
ret1 *= -1;
}
ret %=ret1;
if (sm1 != sm2)
ret *= -1;
}
}
return ret;
}
int exp()
{
int ret = ter();
int x;
while (p < n && (s2[p] == '+' || s2[p] == '-'))
{
x = 2;
if (s2[p] == '+')
x = 1;
++p;
if (x == 1)
ret += ter();
else
ret -= ter();
}
return ret;
}
void readnsolve()
{
s2.clear();
getline(cin, s2);
p = 0;
n = s2.size();
sol = exp();
}
void write()
{
printf("%d\n", sol);
}
int main()
{
freopen("evaluare.in", "r", stdin);
freopen("evaluare.out","w",stdout);
readnsolve();
write();
return 0;
}