Cod sursa(job #12205)

Utilizator peanutzAndrei Homorodean peanutz Data 3 februarie 2007 11:20:09
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <stdio.h>
#include <string.h>
#include <ctype.h>

#define NMAX 2000

char s[NMAX];
long n, i;
long max;

void read()
{
scanf("%s\n", s);

n = strlen(s);
}

long make_number()
{
long nr = 0;

while(isdigit(s[i]))
	{
		nr = nr * 10 + (s[i++]-'0');
	}
return nr;
}


long solve()
{
long rez = 0;

while(i < n)
	{
		if(isdigit(s[i]))
			{
				if(isdigit(s[i]))
					rez += make_number();


			}

		else if(s[i] == '-')
			{
				++i;

				if(isdigit(s[i]))
					rez -= make_number();

				else if(s[i] == '(')
					{
						++i;

						rez -= solve();
					}
			}

		else if(s[i] == '+')
			{
				++i;

				if(isdigit(s[i]))
					rez += make_number();

				else if(s[i] == '(')
					{
						++i;

						rez += solve();
					}
			}

		else if(s[i] == '*')
			{
				++i;

				if(isdigit(s[i]))
					rez *= make_number();

				else if(s[i] == '(')
					{
						++i;

						rez *= solve();
					}
			}

		else if(s[i] == '/')
			{
				++i;

				if(isdigit(s[i]))
					rez /= make_number();

				else if(s[i] == '(')
					{
						++i;

						rez /= solve();
					}
			}

		else if(s[i] == ')')
			{
				++i;

				if(max < rez)
					max = rez;



				while(s[i] == '*'  ||  s[i] == '/')
					{
						if(s[i] == '*')
							{
								++i;

								if(isdigit(s[i]))
									rez *= make_number();
								else
									rez *= solve();

							}
						else if(s[i] == '/')
							{
								++i;

								if(isdigit(s[i]))
									rez /= make_number();
								else
									rez /= solve();

							}
					}
				break;

			}

		else if(s[i] == '(')
			{
				++i;

				rez += solve();
			}
	}

if(i == n)
	if(rez > max)
		max = rez;

return rez;
}



int main()
{
freopen("max.in", "r", stdin);
freopen("max.out", "w", stdout);

read();

solve();

printf("%ld\n", max);

fclose(stdin);
fclose(stdout);

return 0;
}