Код:
//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;
}