Cod sursa(job #156584)

Utilizator plastikDan George Filimon plastik Data 12 martie 2008 17:16:35
Problema Evaluarea unei expresii Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <stdio.h>
#include <string.h>
#define NMAX 100002

char Exp[NMAX];

long long evalExp(int l, int r) {
	int i;
	/*for (i = l; i <= r; ++ i)
		printf("%c", Exp[i]);
	printf("\n");*/
	
	int nPar = 0, iDiv = -1;
	
	for (i = r; i >= l; -- i) {
		if (Exp[i] == ')') {
			++ nPar;
			continue;
		}
		if (Exp[i] == '(') {
			-- nPar;
			continue;
		}
		
		if (nPar == 0) {
			if (Exp[i] == '+')
				return evalExp(l, i - 1) + evalExp(i + 1, r);
			if (Exp[i] == '-')
				return evalExp(l, i - 1) - evalExp(i + 1, r);
			
			if ((Exp[i] == '*' || Exp[i] == '/') && iDiv == -1)
				iDiv = i;
		}
	}
	
	if (iDiv != -1)
		if (Exp[iDiv] == '*')
			return evalExp(l, iDiv - 1) * evalExp(iDiv + 1, r);
		else
			return evalExp(l, iDiv - 1) / evalExp(iDiv + 1, r);
	
	if (Exp[l] == '(' && Exp[r] == ')')
		return evalExp(l + 1, r - 1);
	
	long long x;
	sscanf(Exp + l, "%lld", &x);
	return x;
}

int main() {
	
	freopen("evaluare.in", "r", stdin);
	freopen("evaluare.out", "w", stdout);
	
	scanf("%s", Exp);
	
	long long ans = evalExp(0, strlen(Exp) - 1);
	printf("%lld\n", ans);
	
	return 0;
}