Pagini recente » Cod sursa (job #66503) | Cod sursa (job #2583950) | Cod sursa (job #1349935) | Cod sursa (job #2981741) | Cod sursa (job #517344)
Cod sursa(job #517344)
#include <stdio.h>
#include <string.h>
char s[100001];
long paranteze (long &st, long &dr)
{
long nr = 0;
while(s[st] == '(' && s[dr] == ')')
st++, dr--;
for(long i = st; i<=dr; i++)
{
if( s[i] == '(')
nr++;
if( s[i] == ')')
nr--;
if(nr < 0)
return 0;
}
return 1;
}
long semn(long &st, long &dr, char c1, char c2)
{
long nrr = 0;
while(s[st] == '(' && s[dr] == ')')
st++, dr--;
for(long i = st; i<=dr; i++)
{
if(s[i] == '(')
nrr++;
else
if(s[i] == ')')
nrr--;
else
if( (s[i] == c1 || s[i] == c2) && nrr == 0)
return i;
}
return -1;
}
long transf(long st, long dr)
{
long x = 0;
for(long i = st; i<=dr; i++)
x = x*10 + (s[i] - '0');
return x;
}
long fct (long st, long dr)
{
while(s[st] == ' ')
st++;
while(s[dr] == ' ')
dr--;
if(paranteze(st, dr))
{
long ss = semn(st, dr, '+', '-');
if(ss == -1)
ss = semn(st, dr, '*', '/');
if(ss == -1)
return transf(st, dr);
long s1 = fct(st, ss-1), s2 = fct(ss+1, dr);
switch(s[ss])
{
case '+': return s1+s2;
case '-': return s1-s2;
case '*': return s1*s2;
default: return s1/s2;
}
}
}
int main ()
{
freopen("evaluare.in", "r", stdin);
freopen("evaluare.out", "w", stdout);
fgets(s, 100000, stdin);
long n = strlen(s);
long a = fct(0, n-2);
printf("%ld\n", a);
return 0;
}