Cod sursa(job #2708019)

Utilizator Casian_doispeChiriac Casian Casian_doispe Data 18 februarie 2021 09:54:46
Problema Evaluarea unei expresii Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.83 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <deque>
#include <unordered_set>
#include <unordered_map>
#include <bitset>
#include <climits>
#include <queue>

#define MOD 66601

using namespace std;

ifstream cin("evaluare.in") ;
ofstream cout("evaluare.out") ;

/// trebe sa gasim primul

long long poww(long long a, long long n)
{

    long long aux = 1 ;

    while(n --)
        aux *= a ;

    return aux ;

}

char *urm_elem(char *a, char *cautat, int n)
{

    //cout << a << " " << cautat << " " << n << endl ;

    int aux = 0 ;

    for(int f = n - 1 ; f >= 0 ; f --)
    {

        if(a[f] == ')')aux ++ ;
            else if(a[f] == '(') aux -- ;

        if(!aux && strchr(cautat, a[f]))return &a[f] ;

    }

    return 0 ;

}

long long eval_exp(char *a, int n)
{

    while(a[0] == '(' && a[n - 1] == ')')n -= 2, a ++ ; /// scoatem parantezele useless

    char *ptr ;

    if(ptr = urm_elem(&a[0], "+-", n))
    {

        if(*ptr == '+')return eval_exp(a, ptr - a) + eval_exp(ptr + 1, n - (ptr - a) - 1) ;
        if(*ptr == '-')return eval_exp(a, ptr - a) - eval_exp(ptr + 1, n - (ptr - a) - 1) ;

    }

    if(ptr = urm_elem(&a[0], "*/", n))
    {

        if(*ptr == '*')return eval_exp(a, ptr - a) * eval_exp(ptr + 1, n - (ptr - a) - 1) ;
        if(*ptr == '/')return eval_exp(a, ptr - a) / eval_exp(ptr + 1, n - (ptr - a) - 1) ;

    }

    if(ptr = urm_elem(&a[0], "^", n))
    {

        if(*ptr == '-')return poww(eval_exp(a, ptr - a), eval_exp(ptr + 1, n - (ptr - a) - 1)) ;

    }

    string aux ;

    for(int f = 0 ; f < n ; f ++)
        aux += a[f] ;

    return atoll(&aux[0]) ;

}

int main()
{

    string a ;

    cin >> a ;

    cout << eval_exp(&a[0], a.size()) ;

    return 0 ;
}