Pagini recente » Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #1252912) | Monitorul de evaluare | Cod sursa (job #3182094)
#include<fstream>
#include<string>
std::ifstream fin("evaluare.in");
std::ofstream fout("evaluare.out");
std::string exp;
long long size;
int findSign(int st, int dr, int s1, int s2)
{
int nr=0;
for(int index=dr; index>=st; --index)
{
if(exp[index]==')')
++nr;
else if(exp[index]=='(')
--nr;
if(!nr && exp[index]==s1 || exp[index]==s2)
return index;
}
return -1;
}
int createNum(int st, int dr)
{
int ans=0;
for(int index=st; index<=dr; ++index)
ans=ans*10+(exp[index]-'0');
return ans;
}
int solve(int st, int dr)
{
int local= findSign(st, dr, '+', '-');
if(local!=-1)
{
int e1=solve(st, local-1);
int e2=solve(local+1, dr);
if(exp[local]=='+')
return e1+e2;
return e1-e2;
}
local=findSign(st, dr, '*', '/');
if(local!=-1)
{
int e1=solve(st, local-1);
int e2=solve(local+1, dr);
if(exp[local]=='*')
return e1*e2;
return e1/e2;
}
if(exp[st]=='(' && exp[dr]==')')
return solve(st+1, dr-1);
return createNum(st, dr);
}
int main()
{
fin>>exp;
size=exp.size();
fout<<solve(0, size-1);
return 0;
}