Cod sursa(job #2899244)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 8 mai 2022 12:50:19
Problema Evaluarea unei expresii Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
/// always:
#include <cstdio>
#include <string>

/// optional:
#include <cassert>
#include <cstring>
#include <iostream>

bool home = 1;
using namespace std;

const string TASKNAME="evaluare";

const int N=100000+7;
int p=0;
char s[N];

int read_term();
int get();

int read_term() {
  int term;
  if (s[p]=='(') {
    p++;
    term=get();
    assert(s[p]==')');
    p++;
  }else{
    int sgn=+1,num=0;
    bool is=0;
    while(s[p]=='-'||s[p]=='+') {
      if (s[p]=='-') sgn*=-1;
      p++;
    }
    while('0'<=s[p]&&s[p]<='9') {
      num=10*num+s[p]-'0';
      p++;
      is=1;
    }
    num*=sgn;
    if (!is) {
      assert(0);
    }
    term=sgn*num;
  }
  return term;
}

int get() {
  int sol=read_term();
  while (s[p]=='*'||s[p]=='/') {
    char op=s[p];
    p++;
    int term=read_term();
    if (op=='*') sol*=term;
    else sol/=term;
  }
  if (s[p]=='+' || s[p]=='-') {
    char op=s[p];
    p++;
    int term=get();
    if (op=='+') sol+=term;
    else sol-=term;
  }
  return sol;
}

signed main() {
#ifdef INFOARENA
  home = 0;
#endif

  if(!home) {
    freopen((TASKNAME + ".in").c_str(), "r", stdin);
    freopen((TASKNAME + ".out").c_str(), "w", stdout);
  }else{
    freopen ("I_am_iron_man", "r", stdin);
  }

  scanf("%s",&s);
  printf("%d\n", get());

}