Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <numeric>
- #include <stdlib.h>
- using namespace std;
- class Rational {
- private:
- int a, b;
- public:
- Rational(int numerator = 0, int denominator = 1) :
- a(numerator), b(denominator) {}
- int numerator() const {
- return (static_cast<double>(a) / b > 0) ? abs(a) / gcd(a, b) : -abs(a) / gcd(a, b);
- }
- int denominator() const {
- return (b > 0) ? b / gcd(a, b) : -b / gcd(a, b);
- }
- Rational operator+() const {
- return *this;
- }
- Rational operator-() const {
- return {-a, b};
- }
- bool operator==(const Rational &num) const {
- return numerator() == num.numerator() && denominator() == num.denominator();
- }
- bool operator!=(const Rational &num) const {
- return numerator() != num.numerator() || denominator() != num.denominator();
- }
- Rational &operator+=(const Rational &num) {
- a = a * num.denominator() + num.numerator() * b;
- b *= num.denominator();
- return *this;
- }
- Rational &operator-=(const Rational &num) {
- a = a * num.denominator() - num.numerator() * b;
- b *= num.denominator();
- return *this;
- }
- Rational &operator*=(const Rational &num) {
- a *= num.numerator();
- b *= num.denominator();
- return *this;
- }
- Rational &operator/=(const Rational &num) {
- a *= num.denominator();
- b *= num.numerator();
- return *this;
- }
- Rational operator++(int) {
- auto c = *this;
- a += b;
- return c;
- }
- Rational &operator++() {
- a += b;
- return *this;
- }
- Rational operator--(int) {
- auto c = *this;
- a -= b;
- return c;
- }
- Rational &operator--() {
- a -= b;
- return *this;
- }
- };
- Rational operator+(const Rational &a, const Rational &b) {
- return {a.numerator() * b.denominator() + b.numerator() * a.denominator(),
- a.denominator() * b.denominator()};
- }
- Rational operator-(const Rational &a, const Rational &b) {
- return {a.numerator() * b.denominator() - b.numerator() * a.denominator(),
- a.denominator() * b.denominator()};
- }
- Rational operator*(const Rational &a, const Rational &b) {
- return {a.numerator() * b.numerator(), a.denominator() * b.denominator()};
- }
- Rational operator/(const Rational &a, const Rational &b) {
- return {a.numerator() * b.denominator(), a.denominator() * b.numerator()};
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement