Cod sursa(job #2115597)

Utilizator MarianConstantinMarian Constantin MarianConstantin Data 26 ianuarie 2018 22:01:03
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

char a[100010];
int n;

int cautasemn1(int st, int dr)
{
    int nr=0;
    for (int i=dr; i>=st; i--)
    {
        if (nr==0 && (a[i]=='+' || a[i]=='-'))
            return i;
        if (a[i]==')')
            nr++;
        else
            if (a[i]=='(')
                nr--;
    }
    return -1;
}

int cautasemn2(int st, int dr)
{
    int nr=0;
    for (int i=dr; i>=st; i--)
    {
        if (nr==0 && (a[i]=='*' || a[i]=='/'))
            return i;
        if (a[i]==')')
            nr++;
        else
            if (a[i]=='(')
                nr--;
    }
    return -1;
}

long long numar(int st, int dr)
{
    long long x=0;
    for (int i=st; i<=dr; i++)
        x=x*10+(a[i]-48);
    return x;
}

long long expresie(int st, int dr)
{
    int semn;
    semn=cautasemn1(st, dr);
    if (semn!=-1)
    {
        long long e1, e2;
        e1=expresie(st, semn-1);
        e2=expresie(semn+1, dr);
        if (a[semn]=='+')
            return e1+e2;
        return e1-e2;
    }
    semn=cautasemn2(st, dr);
    if (semn!=-1)
    {
        long long e1, e2;
        e1=expresie(st, semn-1);
        e2=expresie(semn+1, dr);
        if (a[semn]=='*')
            return e1*e2;
        return e1/e2;
    }
    if (a[st]=='(' && a[dr]==')')
        return expresie(st+1, dr-1);
    return numar(st, dr);
}

int main()
{
    ifstream fin("evaluare.in");
    ofstream fout("evaluare.out");
    fin.getline(a, 100010);
    n=strlen(a);
    fout << expresie(0, n-1);
    return 0;
}