Cod sursa(job #591174)

Utilizator SpiderManSimoiu Robert SpiderMan Data 22 mai 2011 21:32:42
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 3.26 kb
# include <cstring>
# include <cmath>
# include <cstdlib>
# include <fstream>
# include <iomanip>
using namespace std ;

# define c(X) ((int) (X))

typedef long double ld ;
const char *FIN = "evaluare.in", *FOU = "evaluare.out" ;
const int MAX = 100010, F_MAX = 170 ;

char S[MAX], *p = S;
ld sg, F[F_MAX + 1] ;

bool litera (char);
ld subexp ();
ld fact ();
ld solve ();
ld f_abs ();
ld sigma ();
ld pi_p ();
ld put ();
int vezi ();
void init ();
ld C ();
ld A ();
ld P ();

int main (void) {
    ifstream f (FIN) ;
    f.getline (S, MAX), init () ;
    ofstream g (FOU) ;
    g << setprecision (350) << solve () << "\n" ;
}

void init () {
    F[0] = 1;
    for (int i = 1; i <= F_MAX; ++i) {
        F[i] = i * F[i - 1] ;
    }
}

bool litera ( char S ) {
    return (S >= 'a' && S <= 'z') || (S >= 'A' && S <= 'Z') ;
}

ld solve () {
    ld r = subexp();

    while ( *p == '+' || *p == '-' )
        if ( *p == '+' )
            ++p, r += subexp() ;
        else if ( *p == '-' )
            ++p, r -= subexp() ;

    return r;
}

ld subexp () {
    int r = put();

    while ( *p == '*' || *p == '/' ) {
        if ( *p == '*' )
            ++p, r *= put() ;
        else if ( *p == '/' )
            ++p, r /= put() ;
    }

    return r;
}

ld fact () {
    ld r = 0 ;
    if ( *p == '(' ) {
        ++p, r = solve(), ++p;
    } else if ( *p == '|' ) {
        ++p, r = f_abs(), ++p ;
    } else if ( *p == 's' && *(p+1) == 'i' && *(p+2) == 'g' ) {
        p += 6, r = sigma(), ++p ;
    } else if ( *p == 'p' && *(p+1) == 'i' ) {
        p += 3, r = pi_p(), ++p ;
    } else if ( *p == 'C' ) {
        p += 2, r = C(), ++p ;
    } else if ( *p == 'A' ) {
        p += 2, r = A(), ++p ;
    } else if ( *p == 'P' ) {
        p += 2, r = P(), ++p ;
    } else {
        for ( ; (*p >= '0' && *p <= '9') || litera (*p) ; ++p ) {
            if ( litera (*p) ) r = r * 10 + sg;
            else r = r * 10 + *p - '0';
        }
    }
    return r;
}

ld put () {
    ld r = fact() ;

    while ( *p == '^' || *p == '!' ) {
        if ( *p == '^' )
            ++p, r = pow (r, put ());
        else ++p, r = F[c(r)] ;
    }
    return r ;
}

ld f_abs () {
    ld r = solve () ;
    return (ld) fabs (r) ;
}

ld sigma () {
    ld st, dr, r = 0 ;
    st = solve (), ++p, dr = solve (), ++p ;
    int nr = vezi () ;
    for ( int i = st; i <= dr; ++i ) {
        p -= nr ;
        sg = i ;
        r += solve () ;
    }
    return r ;
}

ld pi_p () {
    ld st, dr, r = 1 ;
    st = solve (), ++p, dr = solve (), ++p ;
    int nr = vezi () ;
    for ( int i = st; i <= dr; ++i ) {
        p -= nr ;
        sg = i ;
        r *= solve () ;
    }
    return r ;
}

int vezi () {
    int nr = 0 ;
    for ( int nr1 = 0;  ; ++p, ++nr ) {
        if ( *p == '(' ) ++nr1 ;
        else if ( *p == ')' && nr1 == 0 ) break ;
        else if ( *p == ')' ) --nr1 ;
    }
    return nr ;
}

ld C () {
    ld r, rr ;
    r = solve (), ++p, rr = solve () ;
    return F[c(r)] / (F[c(rr)] * F[c(r - rr)]) ;
}

ld A () {
    ld r, rr ;
    r = solve (), ++p, rr = solve () ;
    return F[c(r)] / F[c(r - rr)] ;
}

ld P () {
    ld r ;
    r = solve (), ++p ;
    return F[c(r)] ;
}