Pagini recente » Cod sursa (job #2740028) | Cod sursa (job #1048731) | Cod sursa (job #2637557) | Cod sursa (job #2828797) | Cod sursa (job #1051954)
#include <fstream>
#include <cstring>
using namespace std;
#define Nmax 100003
ifstream f("evaluare.in");
ofstream g("evaluare.out");
struct par{int a,b,d;};
par v[Nmax];
int compare_ints( const void* a, const void* b ) {
par* arg1 = (par*) a;
par* arg2 = (par*) b;
if( (*arg1).d < (*arg2).d ) return -1;
else if( (*arg1).d == (*arg2).d ) return 0;
else return 1;
}
char S[Nmax],*p,s[Nmax];
void change(long long sum,int a,int b)
{
int i;
while(sum!=0)
{
S[b]=sum%10+48;
sum/=10;
b--;
}
for(i=b;i>=a;i--) S[i]='0';
}
void op1(int a,int b)
{
int i=0,semn;
long long nr,sum=0;
s[0]='0';
s[1]='\0';
strncat(s,S+a,b);
s[b+1]='\0';
semn=1;
while(i<=b)
{
if(s[i]==')') i++;
else {
nr=0;
while(s[i]>='0' && s[i]<='9') nr=nr*10+s[i++]-48;
sum+=semn*nr;
if(s[i]=='+') semn=1; else semn=-1;
i++; }
}
change(sum,a,a+b-1);
}
void op3(int a,int b)
{
int i,ja,jb,ct=0;
long long nr,sum=0;
char *p;
s[0]='\0';
strncat(s,S+a,b);
s[b]='\0';
while(p=(strpbrk(s,"/*")))
{
nr=0;
i=p-s-1;
while(s[i]>='0' && s[i]<='9') i--;
ja=(++i);
while(s[i]>='0' && s[i]<='9') nr=nr*10+s[i++]-48;
sum=nr;
nr=0;
i=p-s+1;
while(s[i]>='0' && s[i]<='9') nr=nr*10+s[i++]-48;
jb=i-1;
if(p[0]=='*') sum*=nr;
else sum/=nr;
change(sum,ja+ct+a,jb+ct+a);
strcpy(s+ja,s+jb);
ct=jb-ja;
}
}
void op2(int a,int b)
{
int i,ja,jb;
long long nr,sum=0;
int p;
b+=a-1;
for(p=a;p<=b;p++) if(S[p]=='*' || S[p]=='/')
{
nr=0;
i=p-1;
while(S[i]>='0' && S[i]<='9') i--;
ja=(++i);
while(S[i]>='0' && S[i]<='9') nr=nr*10+S[i++]-48;
sum=nr;
nr=0;
i=p+1;
while(S[i]>='0' && S[i]<='9') nr=nr*10+S[i++]-48;
jb=i-1;
if(S[p]=='*') sum*=nr;
else sum/=nr;
change(sum,ja,jb);
}
}
int main()
{
int i=-1,j=-1,k;
while(f>>S[++i])
{
if(S[i]=='(') v[++j].a=i;
if(S[i]==')')
{
k=j;
while(v[k].d!=0) k--;
v[k].b=i;
v[k].d=v[k].b-v[k].a;
}
}
S[++i]='\0';
qsort( v, j+1, sizeof(par), compare_ints );
for(i=0;i<=j;i++)
{
S[v[i].a]='0';
op2(v[i].a+1,v[i].d);
op1(v[i].a+1,v[i].d);
}
k=strlen(S);
op2(0,k);
op1(0,k);
g<<atoi(S)<<"\n";
f.close();
g.close();
return 0;
}