Cod sursa(job #593075)

Utilizator vladtarniceruVlad Tarniceru vladtarniceru Data 1 iunie 2011 10:19:40
Problema Evaluarea unei expresii Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include<fstream.h>
char v[100010];
int x=0, n;
long long max=- (1LL << 50);

long extrage_nr()
{
	long nr=0;
	while(v[x]-'0'>=0 && v[x]-'0'<10 && x<=n)
	{
		nr=nr*10+(int)v[x]-'0';
		x++;
	}
	return nr;
}

long long expresie()
{
	long long num[100020];
	long long i, k=0, aux;
	char semne[100020];
	while(v[x]!=')' && x<=n)
	{
		if(v[x]=='(')
		{
			x++;
			num[k]=expresie();
			k++;
		}
		else if(v[x]=='+' || v[x]=='*' || v[x]=='/' || v[x]=='-')
		{
			semne[k-1]=v[x];
			x++;
		}
		else
		{
			num[k]=extrage_nr();
			k++;
		}
	}
	x++;
	for(i=0; i<k-1; ++i)
		if(semne[i]=='*' || semne[i]=='/')
		{
			if(semne[i]=='*')
				num[i+1]*=num[i];
			else
				num[i+1]=num[i]/num[i+1];
			num[i]=-2000000001;
		}
	for(i=0; i<k-1; ++i)
		if(semne[i]=='+' || semne[i]=='-')
		{
			aux=i+1;
			while(num[aux]==-2000000001)
				aux++;
			if(semne[i]=='-')
				num[aux]=num[i]-num[aux];
			else
				num[aux]+=num[i];
		}
	/*if(num[k-1]>max)
		max=num[k-1];*/
	return num[k-1];
}	

int main()
{
	long long nr;
	ifstream f("evaluare.in");
	f.getline(v, 100001);
	n=strlen(v)-1;
	nr=expresie();
/*	if(nr>max)
		max=nr;
*/	ofstream g("evaluare.out");
	g<<nr;
	g.close();
	return 0;
}