Vladislav_Bezruk

Some task

Jan 4th, 2021 (edited)
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.92 KB | None | 0 0
  1. //https://www.e-olymp.com/uk/problems/1017
  2.  
  3. #include <stdio.h>
  4. #define lli long long int
  5.  
  6. struct num {
  7.     lli sign;
  8.     lli integer;
  9.     lli numerator;
  10.     lli denominator;
  11.    
  12.     num() {
  13.         sign = 1;
  14.         integer = 0;
  15.         numerator = 0;
  16.         denominator = 1;
  17.     }
  18. };
  19.  
  20. lli cutNum(lli *pos, char s[]) {
  21.     lli num = 0, fpos = *pos, d = 1;
  22.    
  23.     while (s[fpos] >= 48 && s[fpos] <= 57) {
  24.         fpos++;
  25.     }
  26.     fpos--;
  27.    
  28.     for (lli i = fpos; i >= *pos; i--) {
  29.         num += (s[i] - '0') * d;
  30.         d *= 10;
  31.     }
  32.    
  33.     *pos = fpos+1;
  34.    
  35.     return num;
  36. }
  37.  
  38. void readNum(num *n) {
  39.     char s[21];
  40.     lli pos = 0, a = 0, b = 0, c = 0;
  41.     gets(s);
  42.    
  43.     if (s[0] == '-') {
  44.         pos++;
  45.         (*n).sign = -1;
  46.     }
  47.    
  48.     a = cutNum(&pos, s);
  49.    
  50.     if (s[pos] == '/') {
  51.         (*n).numerator = a;
  52.         pos++;
  53.        
  54.         b = cutNum(&pos, s);
  55.         (*n).denominator = b;
  56.        
  57.     } else if (s[pos] == ' ') {
  58.         (*n).integer = a;
  59.         pos++;
  60.        
  61.         if (s[pos] != '\0') {
  62.             b = cutNum(&pos, s);
  63.             pos++;
  64.             c = cutNum(&pos, s);
  65.            
  66.             (*n).numerator = b;
  67.             (*n).denominator = c;
  68.         }
  69.     } else if (s[pos] == '\0') {
  70.         (*n).integer = a;
  71.     }
  72.    
  73. }
  74.  
  75. void printNum(num n) {
  76.     if (n.integer == 0 && n.numerator == 0) printf("0");
  77.     else {
  78.         if (n.sign == -1) printf("-");
  79.         if (n.integer != 0) printf("%lli ", n.integer);
  80.         if (n.numerator != 0) printf("%lli/%lli", n.numerator, n.denominator);     
  81.     }
  82.    
  83.     printf("\n");
  84. }
  85.  
  86. lli nod(lli a, lli b) {
  87.     if (a == b) {
  88.          return a;
  89.     }
  90.     while (a && b) {
  91.         if (a > b) {
  92.             a %= b;
  93.         } else {
  94.             b %= a;
  95.         }
  96.     }
  97.     return a + b;
  98. }
  99.  
  100. void simplify(lli *a, lli *b) {
  101.     while (nod(*a, *b) != 1) {
  102.         lli c = nod(*a, *b);
  103.         *a /= c;
  104.         *b /= c;
  105.     }
  106. }
  107.  
  108. num mult(num a, num b) {
  109.     num c;
  110.     lli m1 = a.integer*a.denominator + a.numerator;
  111.     lli m2 = b.integer*b.denominator + b.numerator;
  112.    
  113.     lli n = m1*m2;
  114.     lli d = a.denominator * b.denominator;
  115.    
  116.     simplify(&n, &d);
  117.    
  118.     c.integer = n/d;
  119.     n -= d*c.integer;
  120.     c.numerator = n;
  121.     c.denominator = d;
  122.    
  123.     c.sign = a.sign*b.sign;
  124.    
  125.     return c;
  126. }
  127.  
  128. num div(num a, num b) {
  129.     lli c = b.numerator;
  130.     b.numerator = b.denominator;
  131.     b.denominator = c;
  132.    
  133.     return mult(a, b);
  134. }
  135.  
  136. lli nok(lli a, lli b) {
  137.     return a*b/nod(a, b);
  138. }
  139.  
  140. num sum(num a, num b) {
  141.     num c;
  142.     lli n, d;
  143.    
  144.     d = nok(a.denominator, b.denominator);
  145.     n = a.sign*a.integer*d + a.sign*a.numerator*d/a.denominator + b.sign*b.integer*d + b.sign*b.numerator*d/b.denominator;
  146.     if (n < 0) {
  147.         c.sign = -1;
  148.         n *= -1;
  149.     }
  150.    
  151.     simplify(&n, &d);
  152.    
  153.     c.integer = n/d;
  154.     n -= d*c.integer;
  155.     c.numerator = n;
  156.     c.denominator = d;
  157.    
  158.     return c;
  159. }
  160.  
  161. num dif(num a, num b) {
  162.     b.sign *= -1;
  163.     return sum(a, b);
  164. }
  165.  
  166. num fn(char s, num a, num b) {
  167.     if (s == '+') return sum(a, b);
  168.     if (s == '-') return dif(a, b);
  169.     if (s == '*') return mult(a, b);
  170.     return div(a, b);
  171. }
  172.  
  173. num a, b, c;
  174. char f;
  175.  
  176. int main() {
  177.    
  178.     readNum(&a);
  179.    
  180.     scanf("%c\n", &f);
  181.    
  182.     readNum(&b);
  183.    
  184.     c = fn(f, a, b);
  185.    
  186.     printNum(c);
  187.    
  188.     return 0;
  189. }
Add Comment
Please, Sign In to add comment