Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- using namespace std;
- int gcd(int a, int b) {
- if (b < 0) { b = -b; }
- if (a < 0) { a = -a; }
- return !b ? a : gcd(b, a % b);
- }
- class Rational {
- private:
- long long p, q;
- public:
- Rational(long long p_new = 0, long long q_new = 1) : p(p_new), q(q_new) {
- if (q < 0) {
- q = -q;
- p = -p;
- }
- }
- long long Q() const {
- return q;
- }
- long long P() const {
- return p;
- }
- long long numerator() const {
- return p;
- }
- long long denominator() const {
- return q;
- }
- Rational operator += (const Rational& other) {
- long long numerator = p * other.Q() + other.P() * q;
- long long denominator = q * other.Q();
- long long reduce = gcd(numerator, denominator);
- if (denominator < 0) {
- numerator = -numerator;
- denominator = -denominator;
- }
- *this = Rational(numerator / reduce, denominator / reduce);
- return *this;
- }
- Rational operator -= (const Rational& other) {
- long long numerator = p * other.Q() - other.P() * q;
- long long denominator = q * other.Q();
- long long reduce = gcd(numerator, denominator);
- if (denominator < 0) {
- numerator = -numerator;
- denominator = -denominator;
- }
- *this = Rational(numerator / reduce, denominator / reduce);
- return *this;
- }
- Rational operator *= (const Rational& other) {
- long long numerator = p * other.P();
- long long denominator = q * other.Q();
- long long reduce = gcd(numerator, denominator);
- if (denominator < 0) {
- numerator = -numerator;
- denominator = -denominator;
- }
- *this = Rational(numerator / reduce, denominator / reduce);
- return *this;
- }
- Rational operator /= (const Rational& other) {
- long long numerator = p * other.q;
- long long denominator = q * other.p;
- long long reduce = gcd(numerator, denominator);
- if (denominator < 0) {
- numerator = -numerator;
- denominator = -denominator;
- }
- numerator /= reduce;
- denominator /= reduce;
- *this = Rational(+numerator, +denominator);
- return *this;
- }
- Rational& operator--(int) {
- *this -= Rational(1, 1);
- return *this;
- }
- Rational operator--() {
- long long a = p, b = q;
- p = p - q;
- return (Rational(a, b));
- }
- Rational& operator++() {
- *this += Rational(1, 1);
- return *this;
- }
- Rational operator++(int) {
- long long a = p, b = q;
- p = p + q;
- return (Rational(a, b));
- }
- };
- Rational operator + (const Rational& r) {
- return Rational(+r.P(), +r.Q());
- }
- Rational operator - (const Rational& r) {
- return Rational(-r.P(), +r.Q());
- }
- Rational operator + (Rational r1, const Rational& r2) {
- return r1 += r2;
- }
- Rational operator - (Rational r1, const Rational& r2) {
- return r1 -= r2;
- }
- Rational operator * (Rational r1, const Rational& r2) {
- return r1 *= r2;
- }
- Rational operator / (Rational r1, const Rational& r2) {
- return r1 /= r2;
- }
- bool operator == (const Rational& r1, const Rational& r2) {
- return r1.P() == r2.P() && r1.Q() == r2.Q();
- }
- bool operator != (const Rational& r1, const Rational& r2) {
- return r1.P() != r2.P() || r1.Q() != r2.Q();
- }
Advertisement
Add Comment
Please, Sign In to add comment