Cod sursa(job #2871167)

Utilizator bigmixerVictor Purice bigmixer Data 12 martie 2022 23:09:49
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
#define all(a) (a).begin(), (a).end()
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#define fr first
#define sc second
#define int long long
#define rc(s) return cout<<s,0
#define rcc(s) cout<<s,exit(0)

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

int n, i = 0;
string s;

int calc();
int precalc1();
int precalc2();

int calc(){
    int ans = precalc1();
    while(i < n && (s[i] == '+' || s[i] == '-')){
        if(s[i] == '+'){
            ++i;
            ans += precalc1();
        }
        else{
            ++i;
            ans -= precalc1();
        }
    }
    return ans;
}

int precalc1(){
    int ans = precalc2();
    while(i < n && (s[i] == '*' || s[i] == '/')){
        if(s[i] == '*'){
            i++;
            ans *= precalc2();
        }
        else{
            i++;
            ans /= precalc2();
        }
    }
    return ans;
}

int precalc2(){
    int ans = 0;
    if(s[i] == '('){
        i++;
        ans = calc();
        i++;
    }
    else{
        while(i < n && (s[i] >= '0' && s[i] <= '9')){
            ans *= 10;
            ans += (s[i] - '0');
            i++;
        }
    }
    return ans;
}

int32_t main(){
   // ios_base::sync_with_stdio(false);cin.tie(0);cerr.tie(0);cout.tie(0);
   freopen("evaluare.in", "r", stdin);
   freopen("evaluare.out", "w", stdout);
    cin >> s;
    n = (int)s.size();
  //  cout << n << '\n';
    cout << calc() << '\n';
}