Cod sursă (job #310828)

Utilizator avatar Coroian_David Coroian David Coroian_David IP ascuns
Problemă Bizar (clasele 9-10) Compilator cpp | 1,71 kb
Rundă Arhiva de probleme Status evaluat
Dată 19 aug. 2017 12:15:15 Scor 100
#include <cstdio>

#include <cstring>

#define MAX_N 100000
#define MAX_NRS 50000

using namespace std;

FILE *f, *g;

char s[MAX_N + 2];

int v[MAX_N + 1];

int stk[MAX_N + 1];

bool isDigit[300];

int crChar;

int len;

int rez;

void getIsDigit()
{
    int i;
    for(i = '0'; i <= '9'; i ++)
        isDigit[i] = 1;
}

void readFile()
{
    f = fopen("bizar.in", "r");

    fgets(s, MAX_N + 2, f);

    len = strlen(s);

    s[len - 1] = 0;///'\n'

    len --;

    fclose(f);
}

int exp()
{
    int k = 0;
    int stkLen = 0;

    int i = 0;
    while(i < len)
    {
        while(s[i] == ' ' || s[i] == ',')
            i ++;

        if(isDigit[s[i]])
        {
            int nr = 0;
            while(isDigit[s[i]])
            {
                nr = nr * 10 + s[i] - '0';

                i ++;
            }

            v[++ k] = nr;
        }

        else
            if(s[i] == '(')
            {
                stk[++ stkLen] = k;

                i ++;
            }

        else
            if(s[i] == ')')
            {
                int nrs = k - stk[stkLen] ;

                int first = v[stk[stkLen]];

                first %= nrs;

                if(first == 0)
                    first = nrs;

                v[stk[stkLen]] = v[first + stk[stkLen]];

                k = stk[stkLen --];

                i ++;
            }
    }

    return v[k];
}

void solve()
{
    getIsDigit();

    rez = exp();
}

void printFile()
{
    g = fopen("bizar.out", "w");

    fprintf(g, "%d\n", rez);

    fclose(g);
}

int main()
{
    readFile();

    solve();

    printFile();

    return 0;
}