Cod sursa(job #156949)

Utilizator plastikDan George Filimon plastik Data 12 martie 2008 20:06:42
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
// expresia este formata din 3 categorii de componente
// 0. expresii/subexpresii - cele mai importante bloburi => blob0
// 1. blob0 = blob1 + blob1 + ... - blob1 sunt expresii intre care se fac adunari; ele sunt formate din produse
// 2. blob1 = blob2 * blob2 * ... - blob2 sunt expresii intre care se fac produse, ca atare ele pot fi doar numere sau alte expresii
// 3. blob2 = numar / (blob0)

#include <cstdio>
#include <cctype>
#define NMAX 100010

char Exp[NMAX], *Here = Exp;

long long blob1();
long long blob2();

long long blob0() { // blob1 + blob1 + ...
	long long ans = blob1();
	for (; *Here == '+' || *Here == '-'; )
		if (*Here == '+') {
			++ Here;
			ans += blob1();
		} else {
			++ Here;
			ans -= blob1();
		}
	return ans;
}

long long blob1() { // blob 0 * blob 0 * ...
	long long ans = blob2();
	for (; *Here == '*' || *Here == '/'; )
		if (*Here == '*') {
			++ Here;
			ans *= blob2();
		} else {
			++ Here;
			ans /= blob2();
		}
	return ans;
}

long long blob2() { // numar sau (blob0)
	long long ans = 0;
	if (*Here == '(') { // (blob0)
		++ Here; // (
		ans = blob0();
		++ Here; // )
	} else // numar
		for (; isdigit(*Here); ++ Here)
			ans = ans * 10 + *Here - '0';
	return ans;
}

int main() {
	freopen("evaluare.in", "r", stdin);
	freopen("evaluare.out", "w", stdout);
	
	scanf("%s", Exp);
	printf("%lld\n", blob0());
	
	return 0;
}