Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //https://www.e-olymp.com/uk/problems/1017
- #include <stdio.h>
- #include <math.h>
- #include <algorithm>
- using namespace std;
- struct NUM {
- int sign;
- int intr;
- int numr;
- int denr;
- NUM() {
- sign = 1;
- intr = 0;
- numr = 0;
- denr = 1;
- }
- };
- void printNum(NUM n) {
- if (n.intr == 0 && n.numr == 0) printf("0");
- else {
- if (n.sign == -1) printf("-");
- if (n.intr != 0) printf("%d ", n.intr);
- if (n.numr != 0) printf("%d/%d", n.numr, n.denr);
- }
- printf("\n");
- }
- int nod(int a, int b) {
- if (a == b) {
- return a;
- }
- while (a && b) {
- if (a > b) {
- a %= b;
- } else {
- b %= a;
- }
- }
- return a + b;
- }
- int nok(int a, int b) {
- return a*b/nod(a, b);
- }
- int sign(int a) {
- return (a < 0) ? -1 : 1;
- }
- NUM simplify(NUM n) {
- while (nod(n.numr, n.denr) != 1) {
- int c = nod(n.numr, n.denr);
- n.numr /= c;
- n.denr /= c;
- }
- return n;
- }
- NUM fracint(NUM n) {
- int adb = n.numr/n.denr;
- n.intr += adb;
- n.numr -= adb*n.denr;
- return n;
- }
- NUM createNum(int i, int a, int b) {
- NUM n;
- n.sign = sign(i)*sign(a);
- n.intr = abs(i);
- n.numr = abs(a);
- n.denr = b;
- return simplify(fracint(n));
- }
- NUM readNum() {
- int a = 0, b = 0, c = 1;
- char s1;
- scanf("%d%c", &a, &s1);
- if (s1 == ' ' || s1 == '/') {
- if (s1 == '/') {
- b = a;
- a = 0;
- scanf("%d", &c);
- } else {
- scanf("%d/%d", &b, &c);
- }
- }
- return createNum(a, b, c);
- }
- int comDen(NUM a, int c) {
- return (a.intr*c + a.numr*c/a.denr);
- }
- NUM mult(NUM a, NUM b) {
- return createNum(0, a.sign * b.sign * comDen(a, a.denr) * comDen(b, b.denr), a.denr * b.denr);
- }
- NUM div(NUM a, NUM b) {
- swap(b.numr, b.denr);
- return mult(a, b);
- }
- NUM sum(NUM a, NUM b) {
- int cnok = nok(a.denr, b.denr);
- return createNum(0, a.sign*comDen(a, cnok) + b.sign*comDen(b, cnok), cnok);
- }
- NUM dif(NUM a, NUM b) {
- b.sign *= -1;
- return sum(a, b);
- }
- NUM calc(NUM a, char s, NUM b) {
- swap(a, b);
- if (s == '+') return sum(a, b);
- if (s == '-') return dif(a, b);
- if (s == '*') return mult(a, b);
- return div(a, b);
- }
- char readOperation() {
- char s;
- scanf("\n%c", &s);
- return s;
- }
- int main() {
- printNum(calc(readNum(), readOperation(), readNum()));
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment