Cod sursă (job #310821)

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

#include <cstring>

#define MAX_N 100000

using namespace std;

FILE *f, *g;

char s[MAX_N + 2];

int crChar;

int len;

int rez;

int v[MAX_N + 1];

bool isDigit[300];

int exp(int a);
int term();

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);
}

void spaces()
{
    while(crChar < len && s[crChar] == ' ')
        crChar ++;
}

int term()
{
    spaces();

    int nr = 0;
    while(crChar < len && isDigit[s[crChar]])
    {
        nr = nr * 10 + s[crChar] - '0';

        crChar ++;
    }

    spaces();

    if(crChar < len && s[crChar] == '(')
    {
        return exp(nr);
    }

    return nr;
}

void getTerms(int &k)
{
    k = 0;

    while(crChar < len && s[crChar] != ')')
    {
        spaces();

        if(s[crChar] == ',')
            crChar ++;

        if(isDigit[s[crChar]])
            v[++ k] = term();

        spaces();
    }
}

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

    while(crChar < len && s[crChar] == '(')
    {
        spaces();

        crChar ++;

        getTerms(k);

        a = a % k;

        if(a == 0)
            a = k;

        crChar ++;

        spaces();

        a = v[a];
    }

    return a;
}

void solve()
{
    getIsDigit();

    rez = term();
}

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

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

    fclose(g);
}

int main()
{
    readFile();

    solve();

    printFile();

    return 0;
}