Advertisement
Guest User

pp

a guest
Feb 16th, 2019
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.90 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <sstream>
  4. #include <cctype>
  5. #include <algorithm>
  6. #include <iterator>
  7. #include <cstdlib>
  8. #include <vector>
  9.  
  10. int nod(int x, int y) {
  11.     if (y == 0)
  12.         return x;
  13.     return nod(y, x % y);
  14. }
  15.  
  16.  
  17. class Rational {
  18. public:
  19.     int nom;
  20.     int denom;
  21.  
  22.     Rational() {
  23.         nom = 0;
  24.         denom = 1;
  25.     }
  26.  
  27.     Rational(const int &new_n, const int &new_d) {
  28.         if (new_n == 0) {
  29.             nom = 0;
  30.             denom = 1;
  31.          } else {
  32.             nom = new_n;
  33.             denom = new_d;
  34.         }
  35.     }
  36.  
  37.     const Rational simpl() const {
  38.         Rational ans;
  39.         ans.nom = nom;
  40.         ans.denom = denom;
  41.         if (nom != 0) {
  42.             int tmp = nod(nom, denom);
  43.             ans.nom /= tmp;
  44.             ans.denom /= tmp;
  45.         } else {
  46.             ans.nom = 0;
  47.             ans.denom = 1;
  48.         }
  49.         if (ans.denom < 0) {
  50.             ans.nom *= -1;
  51.             ans.denom *= -1;
  52.             return (ans);
  53.         }
  54.         return ans;
  55.     }
  56.  
  57.     int numerator() const {
  58.         return simpl().nom;
  59.     }
  60.  
  61.     int denominator() const {
  62.         return simpl().denom;
  63.     }
  64. };
  65.  
  66. Rational int_to_rat(const int &n) {
  67.     return Rational(n, 1);
  68. }
  69.  
  70. const Rational operator+ (const Rational& l, const Rational& right) {
  71.     Rational sum;
  72.     sum.nom = l.nom * right.denom + right.nom * l.denom;
  73.     sum.denom = l.denom * right.denom;
  74.     return sum;
  75. }
  76.  
  77. const Rational operator+ (const Rational& l, const int& right) {
  78.     Rational r = int_to_rat(right);
  79.     Rational sum;
  80.     sum.nom = l.nom * r.denom + r.nom * l.denom;
  81.     sum.denom = l.denom * r.denom;
  82.     return sum;
  83. }
  84.  
  85. const Rational operator- (const Rational& l, const Rational& right) {
  86.     Rational sum;
  87.     sum.nom = l.nom * right.denom - right.nom * l.denom;
  88.     sum.denom = l.denom * right.denom;
  89.     return sum;
  90. }
  91.  
  92. const Rational operator- (const Rational& l, const int& right) {
  93.     Rational r = int_to_rat(right);
  94.     Rational sum;
  95.     sum.nom = l.nom * r.denom - r.nom * l.denom;
  96.     sum.denom = l.denom * r.denom;
  97.     return sum;
  98. }
  99.  
  100. const Rational operator* (const Rational& l, const Rational& right) {
  101.     Rational sum;
  102.     sum.nom = l.nom * right.nom;
  103.     sum.denom = l.denom * right.denom;
  104.     return sum;
  105. }
  106.  
  107. const Rational operator* (const Rational& l, const int& right) {
  108.     Rational r = int_to_rat(right);
  109.     Rational sum;
  110.     sum.nom = l.nom * r.nom;
  111.     sum.denom = l.denom * r.denom;
  112.     return sum;
  113. }
  114.  
  115. const Rational operator/ (const Rational& l, const Rational& right) {
  116.     Rational sum;
  117.     sum.nom = l.nom * right.denom;
  118.     sum.denom = l.denom * right.nom;
  119.     return sum;
  120. }
  121.  
  122. const Rational operator/ (const Rational& l, const int& right) {
  123.     Rational r = int_to_rat(right);
  124.     Rational sum;
  125.     sum.nom = l.nom * r.denom;
  126.     sum.denom = l.denom * r.nom;
  127.     return sum;
  128. }
  129.  
  130. template <typename T>
  131. Rational operator+= (Rational& l, const T& right) {
  132.     Rational ans = Rational(l.nom, l.denom) + right;
  133.     l.nom = ans.nom;
  134.     l.denom = ans.denom;
  135.     return ans;
  136. }
  137.  
  138. template <typename T>
  139. Rational operator-= (Rational& l, const T& right) {
  140.     Rational ans = Rational(l.nom, l.denom) - right;
  141.     l.nom = ans.nom;
  142.     l.denom = ans.denom;
  143.     return ans;
  144. }
  145.  
  146. template <typename T>
  147. Rational operator*= (Rational& l, const T& right) {
  148.     Rational ans = Rational(l.nom, l.denom) * right;
  149.     l.nom = ans.nom;
  150.     l.denom = ans.denom;
  151.     return ans;
  152. }
  153.  
  154. template <typename T>
  155. Rational operator/= (Rational& l, const T& right) {
  156.     Rational ans = Rational(l.nom, l.denom) / right;
  157.     l.nom = ans.nom;
  158.     l.denom = ans.denom;
  159.     return ans;
  160. }
  161.  
  162. bool operator== (const Rational& l, const Rational& right) {
  163.     return ((l.numerator() == right.numerator()) && (l.denominator() == right.denominator()));
  164. }
  165.  
  166. bool operator== (const Rational& l, const int& right) {
  167.     Rational r = int_to_rat(right);
  168.     return ((l.numerator() == r.numerator()) && (l.denominator() == r.denominator()));
  169. }
  170.  
  171. bool operator== (const int& l, const Rational& right) {
  172.     Rational r = int_to_rat(l);
  173.     return ((right.numerator() == r.numerator()) && (right.denominator() == r.denominator()));
  174. }
  175.  
  176. bool operator!= (const Rational& l, const Rational& right) {
  177.     return ((l.numerator() != right.numerator()) && (l.denominator() != right.denominator()));
  178. }
  179.  
  180. bool operator!= (const Rational& l, const int& right) {
  181.     Rational r = int_to_rat(right);
  182.     return ((l.numerator() != r.numerator()) && (l.denominator() != r.denominator()));
  183. }
  184.  
  185. bool operator!= (const int& l, const Rational& right) {
  186.     Rational r = int_to_rat(l);
  187.     return ((right.numerator() != r.numerator()) && (right.denominator() != r.denominator()));
  188. }
  189.  
  190. Rational& operator++ (Rational& l) {
  191.     l = l + 1;
  192.     return l;
  193. }
  194.  
  195. const Rational operator++ (Rational& l, int) {
  196.     l.nom = l.nom + l.denom;
  197.     return Rational(l.nom - l.denom, l.denom);
  198. }
  199.  
  200. Rational& operator-- (Rational& l) {
  201.     l = l - 1;
  202.     return l;
  203. }
  204.  
  205. const Rational operator-- (Rational& l, int) {
  206.     l.nom = l.nom - l.denom;
  207.     return Rational(l.nom + l.denom, l.denom);
  208. }
  209. Rational operator- (Rational& l) {
  210.     l.nom = -l.nom;
  211.     return Rational(l.nom, l.denom);
  212. }
  213. Rational operator+ (const Rational& l) {
  214.     return Rational(l.nom, l.denom);
  215. }
  216.  
  217. const Rational operator+ (const int& right, const Rational& r) {
  218.     Rational l = {right, 1};
  219.     Rational sum;
  220.     sum.nom = l.nom * r.denom + r.nom * l.denom;
  221.     sum.denom = l.denom * r.denom;
  222.     return sum;
  223. }
  224.  
  225. const Rational operator- (const int& right, const Rational& rr) {
  226.     Rational r = Rational(right, 1);
  227.     return (r - rr);
  228. }
  229. const Rational operator* (const int& right, const Rational& rr) {
  230.     Rational r = Rational(right, 1);
  231.     return (r * rr);
  232. }
  233.  
  234. const Rational operator/ (const int& right, const Rational& rr) {
  235.     Rational r = Rational(right, 1);
  236.     return (r / rr);
  237. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement