Amonin

Untitled

Dec 7th, 2017
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.50 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. #include <cmath>
  4. using namespace std;
  5. long long gcd(long long a, long long b) {
  6.     if (b < 0) { b = -b; }
  7.     if (a < 0) { a = -a; }
  8.     return !b ? a : gcd(b, a % b);
  9. }
  10. class Rational {
  11. private:
  12.     long long p, q;
  13.  
  14. public:
  15.     Rational(long long p_new = 0, long long q_new = 1) : p(p_new), q(q_new) {
  16.         if (q < 0) {
  17.             q = -q;
  18.             p = -p;
  19.         }
  20.     }
  21.     long long Q() const {
  22.         return q;
  23.     }
  24.     long long P() const {
  25.         return p;
  26.     }
  27.     long long numerator() const {
  28.         return p;
  29.     }
  30.     long long denominator() const {
  31.         return q;
  32.     }
  33.     Rational operator += (const Rational& other) {
  34.         long long numerator = p * other.Q() + other.P() * q;
  35.         long long denominator = q * other.Q();
  36.         long long reduce = gcd(numerator, denominator);
  37.         if (denominator < 0) {
  38.             numerator = -numerator;
  39.             denominator = -denominator;
  40.         }
  41.         *this = Rational(numerator / reduce, denominator / reduce);
  42.         return *this;
  43.     }
  44.     Rational operator -= (const Rational& other) {
  45.         long long numerator = p * other.Q() - other.P() * q;
  46.         long long denominator = q * other.Q();
  47.         long long reduce = gcd(numerator, denominator);
  48.         if (denominator < 0) {
  49.             numerator = -numerator;
  50.             denominator = -denominator;
  51.         }
  52.         *this = Rational(numerator / reduce, denominator / reduce);
  53.         return *this;
  54.     }
  55.     Rational operator *= (const Rational& other) {
  56.         long long numerator = p * other.P();
  57.         long long denominator = q * other.Q();
  58.         long long reduce = gcd(numerator, denominator);
  59.         if (denominator < 0) {
  60.             numerator = -numerator;
  61.             denominator = -denominator;
  62.         }
  63.         *this = Rational(numerator / reduce, denominator / reduce);
  64.         return *this;
  65.     }
  66.     Rational operator /= (const Rational& other) {
  67.         long long numerator = p * other.q;
  68.         long long denominator = q * other.p;
  69.         long long reduce = gcd(numerator, denominator);
  70.         if (denominator < 0) {
  71.             numerator = -numerator;
  72.             denominator = -denominator;
  73.         }
  74.         numerator /= reduce;
  75.         denominator /= reduce;
  76.         *this = Rational(+numerator, +denominator);
  77.         return *this;
  78.     }
  79.     Rational& operator--() {
  80.         *this -= Rational(1, 1);
  81.         return *this;
  82.     }
  83.     Rational operator--(int) {
  84.         long long a = p, b = q;
  85.         p = p - q;
  86.         return (Rational(a, b));
  87.     }
  88.     Rational& operator++() {
  89.         *this += Rational(1, 1);
  90.         return *this;
  91.         }
  92.     Rational operator++(int) {
  93.         long long a = p, b = q;
  94.         p = p + q;
  95.         return (Rational(a, b));
  96.     }
  97. };
  98. Rational operator + (const Rational& r) {
  99.     return Rational(+r.P(), +r.Q());
  100. }
  101. Rational operator - (const Rational& r) {
  102.     return Rational(-r.P(), +r.Q());
  103. }
  104. Rational operator + (Rational r1, const Rational& r2) {
  105.     return r1 += r2;
  106. }
  107. Rational operator - (Rational r1, const Rational& r2) {
  108.     return r1 -= r2;
  109. }
  110. Rational operator * (Rational r1, const Rational& r2) {
  111.     return r1 *= r2;
  112. }
  113. Rational operator / (Rational r1, const Rational& r2) {
  114.     return r1 /= r2;
  115. }
  116. bool operator == (const Rational& r1, const Rational& r2) {
  117.     return r1.P() == r2.P() && r1.Q() == r2.Q();
  118. }
  119. bool operator != (const Rational& r1, const Rational& r2) {
  120.     return r1.P() != r2.P() || r1.Q() != r2.Q();
  121. }
Advertisement
Add Comment
Please, Sign In to add comment