Cod sursa(job #3234509)

Utilizator Cezar2009Cezar Mihai Titihazan Cezar2009 Data 9 iunie 2024 14:31:53
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
//https://infoarena.ro/problema/evaluare
#pragma GCC optimize ("Ofast")
#pragma GCC optimize ("fast-math")
#pragma GCC optimize ("unroll-loops")
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

ifstream fin("evaluare.in");
ofstream fout("evaluare.out");

int i;
string s;
int f1();
int f2();
int f3();
int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	fin >> s;
	fout << f1();
	//fout << "\n" << i;
	return 0;
}
int f1()
{
	int r = f2();
	while (s[i] == '+' || s[i] == '-')
	{
		if (s[i] == '+')
		{
			++i;
			r += f2();
		}
		else //if (s[i] == '-')
		{
			++i;
			r -= f2();
		}
		if (i >= s.size())
		{
			break;
		}
	}
	return r;
}
int f2()
{
	int r = f3();
	while (s[i] == '*' || s[i] == '/')
	{
		if (s[i] == '*')
		{
			++i;
			r *= f3();
		}
		else //if(s[i] == '/')
		{
			++i;
			r /= f3();
		}
		if (i >= s.size())
		{
			break;
		}
	}
	return r;
}
int f3()
{
	int r;
	if (s[i] == '(')
	{
		++i;
		r=f1();
		++i;
	}
	else //s[i] e cifra 
	{
		r = 0;
		while (s[i] >= '0' && s[i] <= '9')
		{
			r = r * 10 + s[i] - '0';
			++i;
			if (i >= s.size())
			{
				break;
			}
		}
		//cout << r << " ";
	}
	return r;
}