Cod sursa(job #886019)

Utilizator TeOOOVoina Teodora TeOOO Data 22 februarie 2013 16:54:17
Problema Evaluarea unei expresii Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#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;
}