Pagini recente » Cod sursa (job #1838532) | Cod sursa (job #896661) | Cod sursa (job #1698096) | Cod sursa (job #348761) | Cod sursa (job #1323528)
#include <fstream>
#include <vector>
#include <string.h>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
#define Lmax 100010
#define maxLv 3
char s[Lmax], *p;
char OP[4][4] = {"+-", "/*%", "^", ""};
int rez() ;
int pow(int, int) ;
int get_int() ;
int eval(int, int, char) ;
int main()
{
fin.getline(s, Lmax);
s[ strlen(s) ] = ')';
p = s;
fout << rez() << '\n';
return 0;
}
int rez()
{
int nrop = 0;
vector< int > t;
vector< char > op;
while(*p != ')')
{
if(*p == '(')
{
p++;
t.push_back( rez() );
continue;
}
else if('0' <= *p && *p <= '9') t.push_back( get_int() );
else {op.push_back(*p); ++nrop;}
++p;
}
++p;
int i, lv;
for(lv = maxLv - 1; lv >= 0; --lv)
{
for(i = 0; i < nrop; )
if(strchr(OP[lv], op[i]))
{
t[i] = eval(t[i], t[i+1], op[i]);
t.erase(t.begin() + i + 1);
op.erase(op.begin() + i);
--nrop;
}
else ++i;
}
return *t.begin();
}
int pow(int x, int y)
{
if(!x) return 0;
if(x == 1) return 1;
int rez = 1;
while(y)
{
if(y & 1) rez = (rez * x) % 26;
x = (x * x) % 26;
y >>= 1;
}
return rez;
}
int get_int()
{
int x;
for(x = 0; '0' <= (*p) && (*p) <= '9'; ++p)
x = x * 10 + (*p) - '0';
return x;
}
int eval(int a, int b, char op)
{
switch(op)
{
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return a / b;
case '%': return a % b;
case '^': return pow(a, b);
}
return 0;
}