Cod sursa(job #473911)
#include <stdio.h>
#include <string.h>
using namespace std;
char sir[100001], semne[10001], semn = 'a';
long long numere[1001];
int n, i, j, k;
int sn, par;
long long nr_semn, nr, nr2;
int main ()
{
FILE *f = fopen ("evaluare.in","r");
FILE *g = fopen ("evaluare.out","w");
fscanf (f,"%s", sir);
//printf (sir);
n = nr = 0;
i = 0;
while (sir[i] != '\0')
{
if (sir[i] >= '0' && sir[i] <= '9' && !par)
nr = nr * 10 + sir[i] - '0';
else if (sir[i] >= '0' && sir[i] <= '9' && par)
{
if (semn == 'a')
nr_semn = nr_semn * 10 + sir[i] - '0';
else
{
while (sir[i] >= '0' && sir[i] <= '9' && par)
{
nr2 = nr2 * 10 + sir[i] - '0';
i ++;
}
i --;
if (semn == '+')
nr_semn += nr2;
else if (semn == '-')
nr_semn -= nr2;
else if (semn == '*')
nr_semn *= nr2;
else if (semn == '/')
nr_semn /= nr2;
nr2 = 0;
}
semn = 'a';
}
else if (sir[i] == '(')
par = 1;
else if (sir[i] == ')')
{
n ++;
numere[n] = nr_semn;
nr_semn = 0;
par = 0;
}
else if ((sir[i] == '+' || sir[i] == '-' || sir[i] == '*' || sir[i] == '/') && par)
semn = sir[i];
else if ((sir[i] == '+' || sir[i] == '-' || sir[i] == '*' || sir[i] == '/') && !par)
{
if (nr)
{
n ++;
numere[n] = nr;
nr = 0;
}
if (sir[i] == '/' || sir[i] == '*')
{
semn = sir[i];
i ++;
while (sir[i] >= '0' && sir[i] <= '9' )
{
nr2 = nr2 * 10 + sir[i] - '0';
i ++;
}
i --;
if (semn == '*')
numere[n] *= nr2;
else if (semn == '/')
numere[n] /= nr2;
nr2 = 0;
semn = 'a';
}
else
{
sn ++;
semne[sn] = sir[i];
}
}
i ++;
}
if (nr)
{
n ++;
numere[n] = nr;
nr = 0;
}
for (i=1; i<=sn; ++i)
{
if (semne[i] == '+')
numere[1] += numere[i+1];
else if (semne[i] == '-')
numere[1] -= numere[i+1];
else if (semne[i] == '*')
numere[1] *= numere[i+1];
else if (semne[i] == '/')
numere[1] /= numere[i+1];
}
fprintf (g, "%lld", numere[1]);
fclose (g);
fclose (f);
return 0;
}