Vladislav_Bezruk

Some task

Jan 5th, 2021 (edited)
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.30 KB | None | 0 0
  1. //https://www.e-olymp.com/uk/problems/1017
  2.  
  3. #include <stdio.h>
  4. #include <math.h>
  5. #include <algorithm>
  6.  
  7. using namespace std;
  8.  
  9. struct NUM {
  10.     int sign;
  11.     int intr;
  12.     int numr;
  13.     int denr;
  14.    
  15.     NUM() {
  16.         sign = 1;
  17.         intr = 0;
  18.         numr = 0;
  19.         denr = 1;
  20.     }
  21. };
  22.  
  23. void printNum(NUM n) {
  24.     if (n.intr == 0 && n.numr == 0) printf("0");
  25.     else {
  26.         if (n.sign == -1) printf("-");
  27.         if (n.intr != 0) printf("%d ", n.intr);
  28.         if (n.numr != 0) printf("%d/%d", n.numr, n.denr);      
  29.     }
  30.    
  31.     printf("\n");
  32. }
  33.  
  34. int nod(int a, int b) {
  35.     if (a == b) {
  36.          return a;
  37.     }
  38.     while (a && b) {
  39.         if (a > b) {
  40.             a %= b;
  41.         } else {
  42.             b %= a;
  43.         }
  44.     }
  45.     return a + b;
  46. }
  47.  
  48. int nok(int a, int b) {
  49.     return a*b/nod(a, b);
  50. }
  51.  
  52. int sign(int a) {
  53.     return (a < 0) ? -1 : 1;
  54. }
  55.  
  56. NUM simplify(NUM n) {
  57.     while (nod(n.numr, n.denr) != 1) {
  58.         int c = nod(n.numr, n.denr);
  59.         n.numr /= c;
  60.         n.denr /= c;
  61.     }  
  62.     return n;
  63. }
  64.  
  65. NUM fracint(NUM n) {
  66.     int adb = n.numr/n.denr;
  67.     n.intr += adb;
  68.     n.numr -= adb*n.denr;
  69.     return n;
  70. }
  71.  
  72. NUM createNum(int i, int a, int b) {
  73.     NUM n;
  74.    
  75.     n.sign = sign(i)*sign(a);
  76.     n.intr = abs(i);
  77.     n.numr = abs(a);
  78.     n.denr = b;
  79.    
  80.     return simplify(fracint(n));
  81. }
  82.  
  83. NUM readNum() {
  84.     int a = 0, b = 0, c = 1;
  85.     char s1;
  86.    
  87.     scanf("%d%c", &a, &s1);
  88.    
  89.     if (s1 == ' ' || s1 == '/') {
  90.         if (s1 == '/') {
  91.             b = a;
  92.             a = 0;
  93.             scanf("%d", &c);
  94.         } else {
  95.             scanf("%d/%d", &b, &c);
  96.         }
  97.     }
  98.    
  99.     return createNum(a, b, c);
  100. }
  101.  
  102. int comDen(NUM a, int c) {
  103.     return (a.intr*c + a.numr*c/a.denr);
  104. }
  105.  
  106. NUM mult(NUM a, NUM b) {
  107.     return createNum(0, a.sign * b.sign * comDen(a, a.denr) * comDen(b, b.denr), a.denr * b.denr);
  108. }
  109.  
  110. NUM div(NUM a, NUM b) {
  111.     swap(b.numr, b.denr);
  112.     return mult(a, b);
  113. }
  114.  
  115. NUM sum(NUM a, NUM b) {
  116.     int cnok = nok(a.denr, b.denr);
  117.     return createNum(0, a.sign*comDen(a, cnok) + b.sign*comDen(b, cnok), cnok);
  118. }
  119.  
  120. NUM dif(NUM a, NUM b) {
  121.     b.sign *= -1;
  122.     return sum(a, b);
  123. }
  124.  
  125. NUM calc(NUM a, char s, NUM b) {
  126.     swap(a, b);
  127.    
  128.     if (s == '+') return sum(a, b);
  129.     if (s == '-') return dif(a, b);
  130.     if (s == '*') return mult(a, b);
  131.     return div(a, b);
  132. }
  133.  
  134. char readOperation() {
  135.     char s;
  136.        
  137.     scanf("\n%c", &s);
  138.     return s;
  139. }
  140.  
  141. int main() {
  142.    
  143.     printNum(calc(readNum(), readOperation(), readNum()));
  144.    
  145.     return 0;
  146. }
Advertisement
Add Comment
Please, Sign In to add comment