Cod sursa(job #2811598)

Utilizator Darius_CDarius Chitu Darius_C Data 2 decembrie 2021 18:09:26
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
// 1. Evaluare exp - Divide et Impera.cpp : This file contains the 'main' function. Program execution begins and ends there.
//

#include <iostream>
#include <fstream>
#include <cctype>
#include <cstring>
#define DIM 100006
std::ifstream fin("evaluare.in");
std::ofstream fout("evaluare.out");
using namespace std;

int n;
char s[DIM];

int cautas(int st, int dr, char s1, char s2)
{
	int nr = 0;
	for (int i = dr; i >= st; i--)
	{
		if (s[i] == ')')
			nr++;
		else if (s[i] == '(')
			nr--;
		if (nr == 0 && (s[i] == s1 || s[i] == s2))
			return i;
	}
	return -1;
}

int num(int st, int dr)
{
	int numar = 0;
	for (int i = st; i <= dr; i++)
		numar = numar * 10 + (s[i] - '0');
	return numar;
}

int solve(int st, int dr)
{
	int poz = cautas(st, dr, '+', '-');
	if (poz != -1)
	{
		int e1 = solve(st, poz - 1);
		int e2 = solve(poz + 1, dr);
		if (s[poz] == '+')
			return e1 + e2;
		return e1 - e2;
	}
	poz = cautas(st, dr, '*', '/');
	if (poz != -1)
	{
		int e1 = solve(st, poz - 1);
		int e2 = solve(poz + 1, dr);
		if (s[poz] == '*')
			return e1 * e2;
		return e1 / e2;
	}
	if (s[st] == '(' && s[dr] == ')')
		return solve(st + 1, dr - 1);
	return num(st, dr);
}

int main()
{
	fin.getline(s, DIM);
	n = strlen(s);
	fout << solve(0, n - 1);
	return 0;
}