Cod sursa(job #1051954)

Utilizator ThomasFMI Suditu Thomas Thomas Data 10 decembrie 2013 19:14:14
Problema Evaluarea unei expresii Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 2.73 kb
#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;
}