Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include <vector>
- class RationalNumber
- {
- public: // Constructors
- RationalNumber(int numerator)
- {
- numerator_ = numerator;
- denominator_ = 1;
- }
- RationalNumber(int numerator, int denominator)
- {
- if (denominator == 0)
- throw std::logic_error("Denominator could not be zero!");
- numerator_ = numerator;
- denominator_ = denominator;
- simplify_current_fraction();
- }
- public:
- RationalNumber& operator+=(const RationalNumber& right)
- {
- const int new_numerator = numerator_ * right.denominator_ + right.numerator_ * denominator_;
- const int new_denominator = denominator_ * right.denominator_;
- numerator_ = new_numerator;
- denominator_ = new_denominator;
- simplify_current_fraction();
- return *this;
- }
- RationalNumber operator+(const RationalNumber& right) const
- {
- RationalNumber result(*this);
- result += right;
- return result;
- }
- RationalNumber& operator-=(const RationalNumber& right)
- {
- const int new_numerator = numerator_ * right.denominator_ - right.numerator_ * denominator_;
- const int new_denominator = denominator_ * right.denominator_;
- numerator_ = new_numerator;
- denominator_ = new_denominator;
- simplify_current_fraction();
- return *this;
- }
- RationalNumber operator-(const RationalNumber& right) const
- {
- RationalNumber result(*this);
- result -= right;
- return result;
- }
- RationalNumber& operator*=(const RationalNumber& right)
- {
- numerator_ *= right.numerator_;
- denominator_ *= right.denominator_;
- simplify_current_fraction();
- return *this;
- }
- RationalNumber operator*(const RationalNumber& right) const
- {
- RationalNumber result(*this);
- result *= right;
- return result;
- }
- RationalNumber& operator/=(const RationalNumber& right)
- {
- numerator_ *= right.denominator_;
- denominator_ *= right.numerator_;
- simplify_current_fraction();
- return *this;
- }
- RationalNumber operator/(const RationalNumber& right) const
- {
- RationalNumber result(*this);
- result /= right;
- return result;
- }
- RationalNumber operator-() const
- {
- return RationalNumber(-numerator_, denominator_);
- }
- public: // Overload operator =
- RationalNumber& operator=(const RationalNumber& right)
- {
- if(this != &right)
- {
- numerator_ = right.numerator_;
- denominator_ = right.denominator_;
- }
- return *this;
- }
- public: // Overload boolean operators
- bool operator==(const RationalNumber& right) const
- {
- return numerator_ == right.numerator_ && denominator_ == right.denominator_;
- }
- bool operator<(const RationalNumber& right) const
- {
- return numerator_ * right.denominator_ < right.numerator_* denominator_;
- }
- bool operator<=(const RationalNumber& right) const
- {
- return *this < right || *this == right;
- }
- bool operator>(const RationalNumber& right) const
- {
- return !(*this <= right);
- }
- bool operator>=(const RationalNumber& right) const
- {
- return !(*this < right);
- }
- public:
- friend std::ostream& operator<<(std::ostream& os, const RationalNumber& rational_number);
- private:
- void simplify_current_fraction()
- {
- const int count = std::max(numerator_, denominator_);
- // Here we try to simplify the fraction: if both - numerator & denominator could be divided on value - they will be ;)
- // Example: On input: 12 / 24 = 2 * 2 * 3 / 2 * 2 * 2 * 3 = 1 / 3 will be output
- for(int possible_divider = 2; possible_divider < count; ++possible_divider)
- {
- while (numerator_ % possible_divider == 0 && denominator_ % possible_divider == 0)
- {
- numerator_ /= possible_divider;
- denominator_ /= possible_divider;
- }
- }
- }
- private:
- int denominator_;
- int numerator_;
- };
- std::ostream& operator<<(std::ostream& os, const RationalNumber& rational_number)
- {
- os << rational_number.numerator_ << "/" << rational_number.denominator_;
- return os;
- }
- int main()
- {
- const RationalNumber first(12, 24);
- const RationalNumber second(2, 3);
- std::cout << "fist = " << first << " " << " second = " << second << std::endl;
- std::cout << first + second << std::endl;
- std::cout << first - second << std::endl;
- std::cout << first * second << std::endl;
- std::cout << first / second << std::endl;
- RationalNumber result = first + second;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement