Pagini recente » Cod sursa (job #1854004) | Cod sursa (job #1682465) | Cod sursa (job #159883) | Cod sursa (job #2160897) | Cod sursa (job #188965)
Cod sursa(job #188965)
#include <cstdio>
#include <cctype>
#define MAX_N 100002
char A[MAX_N];
int k;
long pow (long, long);
long eval(void);
long termen(void);
long factor(void);
long putere(void);
int main()
{
freopen("evaluare.in","rt",stdin);
freopen("evaluare.out","wt",stdout);
gets(A);
printf("%ld\n",eval());
}
long eval()
{
long r = termen();
while(A[k] == '+' || A[k] == '-')
{
switch (A[k])
{
case '+':
++k;
r += termen();
break;
case '-':
++k;
r -= termen();
break;
}
}
return r;
}
long termen()
{
long r = factor();
while(A[k] == '*' || A[k] == '/')
{
switch (A[k])
{
case '*':
++k;
r *= factor();
break;
case '/':
++k;
r /= factor();
break;
}
}
return r;
}
long factor()
{
long r = putere();
while(A[k] == '^')
if(A[k] == '^')
{
++k;
r = pow(r, putere());
}
return r;
}
long putere()
{
long r = 0;
if(A[k] == '(')
{
++k;
r = eval();
++k;
}
else
while(isdigit(A[k]))
r = r*10 + A[k++] - '0';
return r;
}
long pow(long A, long B)
{
long r = 1;
while (B)
{
if (B & 1)
{
r = (r * A);
B--;
}
A = (A*A);
B >>= 1;
}
return r;
}