Cod sursa(job #1653474)

Utilizator pickleVictor Andrei pickle Data 16 martie 2016 01:12:07
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <algorithm>
#include <bitset>
#include <cmath>
#include <fstream>
#include <iostream>
#include <queue>
#include <stack>
#include <string.h>
#include <string>
#include <vector>

using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
ifstream fin ("evaluare.in");
ofstream fout ("evaluare.out");

size_t pos = 0;
string A;

ll eval();
ll termen();
ll factor();

int main() {
  fin >> A;
  fout << eval() << endl;

  return 0;
}

ll eval() {
  ll res = termen();
  while(pos < A.size() && (A[pos] == '+' || A[pos] == '-')) {
    if (A[pos] == '+') {
      ++pos;
      res += termen();
    } else {
      ++pos;
      res -= termen();
    }
  }
  //cout << "eval:\t" << pos << ":\t" << res << endl;
  return res;
}

ll termen() {
  ll res = factor();
  while(pos < A.size() && (A[pos] == '*' || A[pos] == '/')) {
    if (A[pos] == '*') {
      ++pos;
      res *= factor();
    } else {
      ++pos;
      res /= factor();
    }
  }
  //cout << "termen:\t" << pos << ":\t" << res << endl;
  return res;
}

ll factor() {
  ll res = 0;
  if (A[pos] == '(') {
    ++pos;
    res = eval();
    ++pos;
  } else {
    while (pos < A.size() && A[pos] >= '0' && A[pos] <= '9') {
      res = res*10 + A[pos] - '0';
      ++pos;
    }
  }
  //cout << "factor:\t" << pos << ":\t" << res << endl;
  return res;
}