Pagini recente » Cod sursa (job #2836179) | Cod sursa (job #1541961) | Cod sursa (job #38658) | Cod sursa (job #2777286) | Cod sursa (job #886019)
Cod sursa(job #886019)
#include <stdio.h>
#include <string.h>
#include <ctype.h>
using namespace std;
const int sz = (int)1e5+1;
const int infinity = (1<<30)-1;
int compute(int left, int right);
FILE *in,*out;
char expresion[sz];
int main()
{
in=fopen("evaluare.in","rt");
out=fopen("evaluare.out","wt");
fscanf(in,"%s",expresion);
fprintf(out,"%d",compute(0,strlen(expresion)-1));
fclose(in);
fclose(out);
return 0;
}
int compute(int left, int right)
{
int brackets = 0;
int gradOp, minGrad = infinity, minPos;
for(int i=left; i<=right; ++i)
{
if(expresion[i] == '(')
brackets++;
else if(expresion[i] == ')')
brackets--;
else if(expresion[i] == '+' || expresion[i] == '-' || expresion[i] == '*' || expresion[i] == '/')
{
gradOp = brackets*2;
if(expresion[i] == '*' || expresion[i] == '/')
gradOp++;
if(gradOp <= minGrad)
{
minGrad = gradOp;
minPos = i;
}
}
}
if(minGrad != infinity)
{
left = compute(left, minPos-1);
right = compute(minPos+1, right);
if(expresion[minPos] == '+')
return left + right;
if(expresion[minPos] == '-')
return left - right;
if(expresion[minPos] == '*')
return left * right;
if(expresion[minPos] == '/')
return left / right;
}
else
{
int number = 0;
for(int i=left; i<=right; ++i)
if(isdigit(expresion[i]))
number = number*10 +(expresion[i]-'0');
return number;
}
return 0;
}