Advertisement
Guest User

Untitled

a guest
Mar 22nd, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.76 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <stdbool.h>
  4. #include <assert.h>
  5.  
  6.  
  7. #define ABC(x) ((x) < 0 ? -(x) : (x))
  8.  
  9. typedef struct
  10. {
  11.     int32_t num, denom;
  12. } Ratio;
  13.  
  14. int32_t Gcd(int32_t a, int32_t b){
  15.     int32_t t;
  16.     while (b != 0) {
  17.         t = b;
  18.         b = a % b;
  19.         a = t;
  20.     }
  21.     return a;
  22. }
  23.  
  24. //int32_t lcm(int32_t a, int32_t b){
  25. //   int32_t g = gcd(a, b);
  26. //   if(g == 0){
  27. //       return 1;
  28. //   }
  29. //   else {
  30. //       return (a * b) / g;
  31. //   }
  32. //}
  33.  
  34. Ratio Normalization(Ratio r){
  35.     int32_t a = Gcd( ABC(r.num), ABC(r.denom) );
  36.  
  37.     r.denom /= a;
  38.     r.num   /= a;
  39.  
  40.     return r;
  41. }
  42.  
  43. void Input(Ratio *pR)
  44. {
  45.     assert(pR);
  46.  
  47.     printf("Enter ration(num denom): ");
  48.     scanf(" %d %d", &pR->num, &pR->denom);
  49.     while(pR->denom == 0){
  50.         printf("The denominator cannot be equal to 0, try again: ");
  51.         scanf(" %d %d", &pR->num, &pR->denom);
  52.     }
  53.  
  54.     if(pR->denom < 0){
  55.         pR->num   *= -1;
  56.         pR->denom *= -1;
  57.     }
  58.  
  59.     *pR = Normalization(*pR);
  60.  
  61. }
  62.  
  63. void Output(const Ratio r)
  64. {
  65.     printf("%d/%d\n", r.num, r.denom);
  66. }
  67.  
  68. int Cmp(const Ratio left, const Ratio right) {
  69.     int32_t g = Gcd(ABC(left.denom), ABC(right.denom));
  70.  
  71.     if((left.num * right.denom / g) < (right.num * left.denom / g )){
  72.         return -1;
  73.     }
  74.     else if((left.denom == right.denom) && (left.num && right.num)){
  75.         return 0;
  76.     }
  77.     else {
  78.         return 1;
  79.     }
  80. }
  81.  
  82. Ratio Sum(Ratio left, Ratio right) {
  83.     int32_t g = Gcd(ABC(left.denom), ABC(right.denom));
  84.     left.num *= right.denom / g;
  85.     right.num *= left.denom / g;
  86.  
  87.     Ratio sum;
  88.     sum.num   = left.num + right.num;
  89.     sum.denom = left.denom * right.denom / g;
  90.  
  91.     return Normalization(sum);
  92. }
  93.  
  94. Ratio Sub(Ratio left, Ratio right) {
  95.     int32_t g = Gcd(ABC(left.denom), ABC(right.denom));
  96.     left.num *= right.denom / g;
  97.     right.num *= left.denom / g;
  98.  
  99.     Ratio sub;
  100.     sub.num   = left.num - right.num;
  101.     sub.denom = left.denom * right.denom / g;
  102.  
  103.     return Normalization(sub);
  104. }
  105.  
  106. Ratio Multi(Ratio left, Ratio right) {
  107.     Ratio multi;
  108.     multi.num   = left.num * right.num;
  109.     multi.denom = left.denom * right.denom;
  110.  
  111.     return Normalization(multi);
  112. }
  113.  
  114. Ratio Div(Ratio left, Ratio right) {
  115.     Ratio div;
  116.     div.num   = left.num * right.denom;
  117.     div.denom = left.denom * right.num;
  118.  
  119.     return Normalization(div);
  120. }
  121.  
  122. int main()
  123. {
  124.     Ratio r;
  125.     Input(&r);
  126.     Output(r);
  127.  
  128.     Ratio r2;
  129.     Input(&r2);
  130.     Output(r2);
  131.  
  132.     printf("cmp(r, r2): %d\n", Cmp(r, r2));
  133.  
  134.     printf("\nSum: "); Output( Sum(r, r2) );
  135.     printf("\nSub: "); Output( Sub(r, r2) );
  136.     printf("\nMulti: "); Output( Multi(r, r2) );
  137.     printf("\nDiv: "); Output( Div(r, r2) );
  138.  
  139.  
  140.     return 0;
  141. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement