Amonin

Untitled

Dec 7th, 2017
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.58 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.         long long reduce = gcd(p, q);
  21.         p /= reduce;
  22.         q /= reduce;
  23.     }
  24.     long long Q() const {
  25.         return q;
  26.     }
  27.     long long P() const {
  28.         return p;
  29.     }
  30.     long long numerator() const {
  31.         return p;
  32.     }
  33.     long long denominator() const {
  34.         return q;
  35.     }
  36.     Rational operator += (const Rational& other) {
  37.         long long numerator = p * other.Q() + other.P() * q;
  38.         long long denominator = q * other.Q();
  39.         long long reduce = gcd(numerator, denominator);
  40.         if (denominator < 0) {
  41.             numerator = -numerator;
  42.             denominator = -denominator;
  43.         }
  44.         *this = Rational(numerator / reduce, denominator / reduce);
  45.         return *this;
  46.     }
  47.     Rational operator -= (const Rational& other) {
  48.         long long numerator = p * other.Q() - other.P() * q;
  49.         long long denominator = q * other.Q();
  50.         long long reduce = gcd(numerator, denominator);
  51.         if (denominator < 0) {
  52.             numerator = -numerator;
  53.             denominator = -denominator;
  54.         }
  55.         *this = Rational(numerator / reduce, denominator / reduce);
  56.         return *this;
  57.     }
  58.     Rational operator *= (const Rational& other) {
  59.         long long numerator = p * other.P();
  60.         long long denominator = q * other.Q();
  61.         long long reduce = gcd(numerator, denominator);
  62.         if (denominator < 0) {
  63.             numerator = -numerator;
  64.             denominator = -denominator;
  65.         }
  66.         *this = Rational(numerator / reduce, denominator / reduce);
  67.         return *this;
  68.     }
  69.     Rational operator /= (const Rational& other) {
  70.         long long numerator = p * other.q;
  71.         long long denominator = q * other.p;
  72.         long long reduce = gcd(numerator, denominator);
  73.         if (denominator < 0) {
  74.             numerator = -numerator;
  75.             denominator = -denominator;
  76.         }
  77.         numerator /= reduce;
  78.         denominator /= reduce;
  79.         *this = Rational(+numerator, +denominator);
  80.         return *this;
  81.     }
  82.     Rational& operator--() {
  83.         *this -= Rational(1, 1);
  84.         return *this;
  85.     }
  86.     Rational operator--(int) {
  87.         long long a = p, b = q;
  88.         p = p - q;
  89.         return (Rational(a, b));
  90.     }
  91.     Rational& operator++() {
  92.         *this += Rational(1, 1);
  93.         return *this;
  94.         }
  95.     Rational operator++(int) {
  96.         long long a = p, b = q;
  97.         p = p + q;
  98.         return (Rational(a, b));
  99.     }
  100. };
  101. Rational operator + (const Rational& r) {
  102.     return Rational(+r.P(), +r.Q());
  103. }
  104. Rational operator - (const Rational& r) {
  105.     return Rational(-r.P(), +r.Q());
  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. Rational operator / (Rational r1, const Rational& r2) {
  117.     return r1 /= r2;
  118. }
  119. bool operator == (const Rational& r1, const Rational& r2) {
  120.     return r1.P() == r2.P() && r1.Q() == r2.Q();
  121. }
  122. bool operator != (const Rational& r1, const Rational& r2) {
  123.     return r1.P() != r2.P() || r1.Q() != r2.Q();
  124. }
Advertisement
Add Comment
Please, Sign In to add comment