Cod sursa(job #1859705)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 27 ianuarie 2017 20:00:09
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.2 kb
#include<cstdio>
#include<cstring>
#include <algorithm>
#define hmax 2
using namespace std;
char s [ 107 ] ;
char *p = s ;
char operand [ 4 ] [ 4 ] = { "+-" , "*/^" , "" , "" } ;
long long eval ( long long ) ;
long long semn ( long long x , long long y , char tip)
{
    if ( tip == '+' )
        return x + y ;
    if ( tip == '^') {
        int p = 1;
        for(int i = 1; i <= y; ++i) {
            p *= x;
        }
        return p;
    }
    if ( tip == '/' )
        return x / y ;
    return 0;
}
long long element ( )
{
    long long r = 0 ;
    if ( * p == '(' )
    {
        ++ p ;
        r = eval ( 0 ) ;
        ++ p ;
    }
    else
        while ( strchr("0123456789", * p ) )
            r = r * 10 + *( ++ p - 1 ) - '0';
    return r;
}
long long eval ( long long h )
{
    long long r = ( h == hmax ) ? element ( ) : eval ( h + 1 ) ;
    while ( strchr ( operand [ h ] , * p ) )
        r = semn ( r , eval ( h + 1 ) , * ( ++ p - 1 )) ;
    return r ;
}
int main()
{
    freopen ( "evaluare1.out" , "w" , stdout ) ;
    fgets(s, 107, fopen("evaluare1.in", "r"));
    int n = strlen(s);
    for(int i = 0; i < n; ++i) {
        if(s[i] == '!') {
            int nr = 0, pz = 0;
            while(s[i] == '!') {
                s[i] = '0';
                ++nr;
                ++i;
            }
            int b[10];
            pz = i;
            b[0] = 0;
            while(s[i] >= '0' && s[i] <= '9') {
                b[++b[0]] = s[i];
                ++i;
            }
            while(b[b[0]] == '0') {
                --b[0];
            }
            int st = 0;
            while(b[st] == '0') {
                ++st;
            }
            if(nr % 2 == 1) {
                reverse(b + 1, b + b[0] + 1);
            }
            for(int l = pz; l <= pz + b[0] - 1; ++l) {
                s[l] = b[l - pz + 1];
            }
            for(int l = pz + b[0]; l < i; ++l) {
                for(int j = l; j < n; ++j) {
                    s[j] = s[j + 1];
                }
                s[n] = '0';
                --i;
                --n;
            }
        }
    }
    printf ( "%lld" , eval ( 0 ) ) ;
    return 0;
}