Cod sursa(job #2956509)

Utilizator ptlsebiptl sebi ptlsebi Data 19 decembrie 2022 18:01:01
Problema Evaluarea unei expresii Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <stdio.h>
#include <stdint.h>

char st[100002];
char *__restrict s = st;

int64_t prod();
int64_t sum();

int64_t term() {
  int64_t sgn = 1;
  int64_t t = 0;
  while (*s == '-') {
    ++s;
    sgn = -sgn;
  }
  if (*s == '(') {
    ++s;
    t = sum();
    ++s;
    return t * sgn;
  }
  while ('0' <= *s && *s <= '9') {
    t *= 10;
    t += *s - '0';
    ++s;
  }
  return t * sgn;
}

int64_t prod() {
  int64_t t = term();
  while (*s == '*' || *s == '/') {
    if (*s == '*') {
      ++s;
      t *= term();
    } else {
      ++s;
      t /= term();
    }
  }
  return t;
}

int64_t sum() {
  int64_t t = prod();
  while (*s == '+' || *s == '-') {
    if (*s == '+') {
      ++s;
      t += prod();
    } else {
      ++s;
      t -= prod();
    }
  }
  return t;
}

void read_str(FILE *__restrict stream, char *__restrict str) {
  while ((*str = fgetc(stream))) {
    if (*str == '\r' || *str == '\n' || *str == '\0') {
      *str = '\0';
      return;
    }
    if (*str != ' ') {
      ++str;
    }
  }
}

int main(void) {
  {
    FILE *__restrict in = fopen("evaluare.in", "r");
  
    read_str(in, st);
  
    fclose(in);
  }

  {
    FILE *__restrict out = fopen("evaluare.out", "w");
  
    fprintf(out, "%li\n", sum());
  
    fclose(out);
  }

  return 0;
}