найти ошибку в коде

rakomakafo

Ефрейтор
Сообщения
9
Реакции
0
Код:
//https://www.e-olymp.com/ru/problems/9425

#include <stdio.h>
#include <math.h>
#include <algorithm>
#define lli long long int

using namespace std;

lli flag = 1;

struct NUM {
  lli numr;
  lli denr;
 
  NUM() {
    numr = 0;
    denr = 1;
  }
};

lli sign(lli a) {
  return (a < 0) ? -1 : 1;
}

void printNum(NUM n) {
  if (flag == 1) {
    int f = sign(n.numr) * sign(n.denr);
    if (f == -1) {
      printf("-");
    }
    printf("%lld/%lld\n", abs(n.numr), abs(n.denr));
  }
}

lli nod(lli a, lli b) {
  if (a == b) {
     return a;
    }
    while (a && b) {
      if (a > b) {
        a %= b;
        } else {
          b %= a;
        }
    }
    return a + b;
}

lli nok(lli a, lli b) {
  return a*b/nod(a, b);
}

NUM simplify(NUM n) {
  lli flag = sign(n.denr) * sign(n.numr);
  n.denr = abs(n.denr);
  n.numr = abs(n.numr);

  while (nod(n.numr, n.denr) != 1) {
      lli c = nod(n.numr, n.denr);
      n.numr /= c;
      n.denr /= c;
    }
  n.numr *= flag;
   
    return n;
}

NUM createNum(lli a, lli b) {
  NUM n;
 
  n.numr = a;
  n.denr = b;
 
  return simplify(n);
}

NUM readNum() {
  lli a, b;
   
  if (flag == 1) {
    flag = scanf("%lld/%lld", &a, &b)/2;
       
        if (flag == 1) {
          lli f = sign(a) * sign(b);
           a = abs(a);
          b = abs(b);
           a *= f;
         return createNum(a, b);
    }
    }
}

lli comDen(NUM a, lli c) {
  return (a.numr*c/a.denr);
}

NUM sum(NUM a, NUM b) {
  lli cnok = nok(a.denr, b.denr);
  return createNum(comDen(a, cnok) + comDen(b, cnok), cnok);
}

NUM dif(NUM a, NUM b) {
  b.numr *= -1;
  return sum(a, b);
}

NUM calc(NUM a, char s, NUM b) {
  if (flag == 1) {
    swap(a, b);
      if (s == '+') return sum(a, b);
      if (s == '-') return dif(a, b);
  }
}

char readOperation() {
  char s;
 
  if (flag == 1) {
    flag = scanf(" %c ", &s);
      return s;
  } 
}

int main() {
 
  while (flag == 1) {
    printNum(calc(readNum(), readOperation(), readNum()));
  }
 
    return 0;
}
 

Золотой

Ефрейтор
Сообщения
7
Реакции
0
У тебя дробь странно читается. В условии задачи дробь на входе - это строка, содержащая слэш. Этого анализа в коде нет. А алгоритм, возможно, правильный.