Cod sursa(job #1323528)

Utilizator Cristian1997Vintur Cristian Cristian1997 Data 21 ianuarie 2015 10:19:17
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.92 kb
#include <fstream>
#include <vector>
#include <string.h>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
#define Lmax 100010
#define maxLv 3

char s[Lmax], *p;
char OP[4][4] = {"+-", "/*%", "^", ""};

int rez() ;
int pow(int, int) ;
int get_int() ;
int eval(int, int, char) ;

int main()
{
    fin.getline(s, Lmax);
    s[ strlen(s) ] = ')';
        
    p = s;
    fout << rez() << '\n';
    
    return 0;
}


int rez()
{
    int nrop = 0;
    vector< int > t;
    vector< char > op;
    
    while(*p != ')')
    {
        if(*p == '(')
        {
            p++;
            t.push_back( rez() );
            continue;
        }
        else if('0' <= *p && *p <= '9') t.push_back( get_int() );
        else {op.push_back(*p); ++nrop;}
        
        ++p;
    }
    ++p;
    
    int i, lv;
    
    for(lv = maxLv - 1; lv >= 0; --lv)
    {
        for(i = 0; i < nrop; )
            if(strchr(OP[lv], op[i]))
            {
                t[i] = eval(t[i], t[i+1], op[i]);
                
                t.erase(t.begin() + i + 1);
                op.erase(op.begin() + i);
                
                --nrop;
            }
            else ++i;
    }
    
    return *t.begin();
}


int pow(int x, int y)
{
    if(!x) return 0;
    if(x == 1) return 1;
    
    int rez = 1;
    
    while(y)
    {
        if(y & 1) rez = (rez * x) % 26;
        x = (x * x) % 26;
        y >>= 1;
    }
    
    return rez;
}


int get_int()
{
    int x;
    for(x = 0; '0' <= (*p) && (*p) <= '9'; ++p)
        x = x * 10 + (*p) - '0';
    return x;
}

int eval(int a, int b, char op)
{
    switch(op)
    {
        case '+': return a + b;
        case '-': return a - b;
        case '*': return a * b;
        case '/': return a / b;
        case '%': return a % b;
        case '^': return pow(a, b);
    }
    return 0;
}