Cod sursa(job #2641013)
Utilizator | Data | 9 august 2020 16:18:52 | |
---|---|---|---|
Problema | Evaluarea unei expresii | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 3.18 kb |
#include <fstream>
using namespace std;
long long l,k,w[100005],tr[100005];
char ch[100005];
long long fu(long long x, long long y)
{
int i=x,x1=0,x2=0,x3=0;
char c1='+',c2='+';
while(i<=y)
{
if(ch[i]=='(')
{
x3=fu(i+1,tr[i]-1);
i=tr[i];
}
else if(ch[i]>='0'&&ch[i]<='9')
{
x3*=10;
x3+=ch[i]-'0';
}
else
{
if((c1=='*')||(c1=='/')||(c2=='+')||(c2=='-'))
{
if(c1=='+')
{
x1+=x2;
x2=x3;
x3=0;
c1=c2;
c2=ch[i];
}
else if(c1=='-')
{
x1-=x2;
x2=x3;
x3=0;
c1=c2;
c2=ch[i];
}
else if(c1=='*')
{
x1*=x2;
x2=x3;
x3=0;
c1=c2;
c2=ch[i];
}
else if(c1=='/')
{
x1/=x2;
x2=x3;
x3=0;
c1=c2;
c2=ch[i];
}
}
else
{
if(c2=='*')
{
x2*=x3;
x3=0;
c2=ch[i];
}
else
{
x2/=x3;
x3=0;
c2=ch[i];
}
}
}
i++;
}
if((c1=='*')||(c1=='/')||(c2=='+')||(c2=='-'))
{
if(c1=='+')
{
x1+=x2;
x2=x3;
x3=0;
c1=c2;
c2=ch[i];
}
else if(c1=='-')
{
x1-=x2;
x2=x3;
x3=0;
c1=c2;
c2=ch[i];
}
else if(c1=='*')
{
x1*=x2;
x2=x3;
x3=0;
c1=c2;
c2=ch[i];
}
else if(c1=='/')
{
x1/=x2;
x2=x3;
x3=0;
c1=c2;
c2=ch[i];
}
}
else
{
if(c2=='*')
{
x2*=x3;
x3=0;
c2=ch[i];
}
else
{
x2/=x3;
x3=0;
c2=ch[i];
}
}
if(c1=='*') x1*=x2;
if(c1=='/') x1/=x2;
if(c1=='+') x1+=x2;
if(c1=='-') x1-=x2;
return x1;
}
int main()
{
ifstream f("evaluare.in");
ofstream g("evaluare.out");
f>>ch;
while(ch[l]) l++;
for(int i=l; i>=1; i--) ch[i]=ch[i-1];
for(int i=1; i<=l; i++)
{
if(ch[i]=='(')
{
k++;
w[k]=i;
}
if(ch[i]==')')
{
tr[w[k]]=i;
w[k]=0;
k--;
}
}
g<<fu(1,l);
f.close(); g.close();
return 0;
}