Cod sursa(job #2785227)

Utilizator EckchartZgarcea Robert-Andrei Eckchart Data 18 octombrie 2021 11:30:08
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include "bits/stdc++.h"
using namespace std;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
using pi = pair<int, int>;
using pll = pair<ll, ll>;
using pd = pair<double, double>;
using pld = pair<ld, ld>;
// #define LOCAL
#ifdef LOCAL
ifstream cin("input.txt");
ofstream cout("output2.txt");
#else
ifstream cin("evaluare.in");
ofstream cout("evaluare.out");
#endif
#define cin ::cin
#define cout ::cout
int idx;
string expr;


int eval();
int termen();
int factor();


int eval()
{
    int res = termen();
    while (expr[idx] == '+' || expr[idx] == '-')
    {
        if (expr[idx] == '+')
        {
            ++idx;
            res += termen();
        }
        else
        {
            ++idx;
            res -= termen();
        }
    }
    return res;
}


int termen()
{
    int res = factor();
    while (expr[idx] == '*' || expr[idx] == '/')
    {
        if (expr[idx] == '*')
        {
            ++idx;
            res *= factor();
        }
        else
        {
            ++idx;
            res /= factor();
        }
    }
    return res;
}


int factor()
{
    if (expr[idx] == '(')
    {
        ++idx;
        const int res = eval();
        ++idx;
        return res;
    }
    int res{};
    while (isdigit(expr[idx]))
    {
        res = res * 10 + expr[idx++] - '0';
    }
    return res;
}


int main()
{
    cin >> expr;
    expr.push_back('?');
    if (expr.front() == '-')
    {
        expr = "0 - " + expr;
    }
    cout << eval();
}