Cod sursa(job #1617366)

Utilizator hackerliAndrei Ion hackerli Data 27 februarie 2016 13:08:48
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 4.85 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
char s[100001];
int t, n;
long long numar();
long long op1();
long long op2();

long long op2()
{
    long long r=op1();
    while(s[t]=='+'||s[t]=='-')
    {
        if(s[t]=='+')
        {
            t++;
            r=r+op1();
        }
        else if(s[t]=='-')
        {
            t++;
            r=r-op1();
        }
    }
    return r;
}
long long op1()
{
    long long r=numar();
    while(s[t]=='*'||s[t]=='/')
    {
        if(s[t]=='*')
        {
            t++;
            r=r*numar();
        }
        else if(s[t]=='/')
        {
            t++;
            r=r/numar();
        }
    }
    return r;
}
long long numar()
{
    long long nr=0;
    if(s[t]=='(')
    {
        t++;
        nr=op2();
        t++;
    }
    else
    {
        while(s[t]>='0'&&s[t]<='9')
        {
            nr=nr*10+(s[t]-'0');
            t++;
        }
    }
    return nr;
}
int main()
{
    fin.getline(s, 1000000);
    n=strlen(s);
    t=0;
    fout<<op2();
    fin.close();
    fout.close();
    return 0;
}
/*
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
char s[100001];
int t, n;
long long numar()
{
    long long nr=0;
    while(s[t]>='0'&&s[t]<='9')
    {
        nr=nr*10+(s[t]-'0');
        t++;
    }
    return nr;
}
long long op1(long long nr)
{
    while(s[t]=='*'||s[t]=='/')
    {
        if(s[t]=='*')
        {
            nr=nr*numar();
        }
        else
        {
            nr=nr/numar();
        }
    }
}
long long eval()
{
    int v[100001];
    char sgn[100001];
    int p=1;
    long long nr=0;
    while(s[t]!=')'&&t<n)
    {
        if(s[t]>='0'&&s[t]<='9')
        {
            nr=numar();
            v[p]=nr;
            p++;
        }
        if(s[t]=='+'||s[t]=='-')
        {
            sgn[p]=s[t];
            v[p]=nr;
            p++;
            t++;
        }
        if(s[t]=='*'||s[t]=='/')
        {
            v[p]=op1(nr);
            p++;
        }
        if(s[t]=='(')
        {
            t++;
            eval();
            t++;
        }
    }
    long long vf=v[1];
    for(int i=0;i<=p;i++)
    {
        cout<<v[i]<<sgn[i];
    }
    cout<<'\n';
    for(int i=1;i<=p;i++)
    {
        if(sgn[i]=='+')
        {
            vf=vf+v[i+1];
        }
        else if(sgn[i]=='-')
        {
            vf=vf-v[i+1];
        }
    }
    return vf;
}
int main()
{
    fin.getline(s, 1000000);
    n=strlen(s);
    t=0;
    fout<<eval();
    fin.close();
    fout.close();
    return 0;
}
*/
/*
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
char s[100001];
int t, n;
long long eval()
{
    int valori[100001];
    char semne[100001];
    int p=1, v=1;
    while(s[t]!=')'&&t<n)
    {
        if(s[t]=='+'||s[t]=='-'||s[t]=='*'||s[t]=='/')
        {
            // cout<<"Caz 1 \n";
            semne[p]=s[t];
            p++;
            t++;
        }
        else if(s[t]>='0'&&s[t]<='9')
        {
            // cout<<"Caz 2 \n";
            int val=0;
            while(s[t]>='0'&&s[t]<='9')
            {
                val=val*10+(s[t]-'0');
                t++;
            }
            valori[v]=val;
            v++;
        }
        else if(s[t]=='(')
        {
            // cout<<"Caz 3 \n";
            t++;
            valori[v]=eval();
            t++; //
            v++;
        }
    }
    t++;
    char saux;
    for(int i=1; i<=p; i++) // de la 0?
    {
        if(semne[i]=='*')
        {
            semne[i]=saux;
            valori[i+1]=valori[i]*valori[i+1];
            valori[i]=0;
        }
        else if(semne[i]=='/')
        {
            semne[i]=saux;
            valori[i+1]=valori[i]/valori[i+1];
            valori[i]=0;
        }
        else
        {
            saux=semne[i];
        }
    }
    long long vf=0;
    int poz=0;
    while(valori[poz]==0&&poz<=v)
        poz++;
    if(poz<v)
    {
        vf=vf+valori[poz];
        for(int i=1; i<=p; i++) // de la 0?
        {
            if(semne[i]=='+')
            {
                vf=vf+valori[i+1];
            }
            else if(semne[i]=='-')
            {
                vf=vf-valori[i+1];
            }
        }
    }
    for(int i=1;i<v;i++)
    {
        cout<<valori[i]<<semne[i];
    }
    cout<<"= ";
    cout<<vf<<'\n';
    return vf;
}
int main()
{
    fin.getline(s, 1000000);
    n=strlen(s);
    t=0;
    fout<<eval();
    fin.close();
    fout.close();
    return 0;
}
*/