Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <numeric>
- #include <iostream>
- using namespace std;
- class Rational {
- public:
- Rational() = default;
- Rational(int numerator)
- : numerator_(numerator)
- , denominator_(1) {
- }
- Rational(int numerator, int denominator)
- : numerator_(numerator)
- , denominator_(denominator) {
- Normalize();
- }
- int Numerator() const {
- return numerator_;
- }
- int Denominator() const {
- return denominator_;
- }
- Rational& operator+=(Rational r) {
- numerator_ = numerator_ * r.Denominator() + denominator_ * r.Numerator();
- denominator_ = denominator_ * r.Denominator();
- Normalize();
- return *this;
- }
- Rational& operator-=(Rational r) {
- numerator_ = numerator_ * r.Denominator() - denominator_ * r.Numerator();
- denominator_ = denominator_ * r.Denominator();
- Normalize();
- return *this;
- }
- Rational& operator*=(Rational r) {
- numerator_ *= r.Numerator();
- denominator_ *= r.Denominator();
- Normalize();
- return *this;
- }
- Rational& operator/=(Rational r) {
- numerator_ *= r.Denominator();
- denominator_ *= r.Numerator();
- Normalize();
- return *this;
- }
- private:
- void Normalize() {
- if (denominator_ < 0) {
- numerator_ = -numerator_;
- denominator_ = -denominator_;
- }
- const int divisor = gcd(numerator_, denominator_);
- numerator_ /= divisor;
- denominator_ /= divisor;
- }
- int numerator_ = 0;
- int denominator_ = 1;
- };
- std::ostream& operator<<(std::ostream& os, const Rational rat){
- os << rat.Numerator() << '/' << rat.Denominator();
- return os;
- }
- std::istream& operator>>(std::istream& is, Rational rat){
- char b;
- is >> rat.Numerator() >> b >> rat.Denominator();
- return is;
- }
- Rational operator+(Rational left, Rational right){
- const int numerator = left.Numerator() * right.Denominator() + right.Numerator() * left.Denominator();
- const int denominator = left.Denominator() * right.Denominator();
- return { numerator, denominator };
- }
- Rational operator-(Rational left, Rational right){
- const int numerator = left.Numerator() * right.Denominator() - right.Numerator() * left.Denominator();
- const int denominator = left.Denominator() * right.Denominator();
- return { numerator, denominator };
- }
- Rational operator+(Rational left){
- return {left.Numerator(), left.Denominator()};
- }
- Rational operator-(Rational left){
- return {-left.Numerator(), left.Denominator()};
- }
- int main(){
- Rational rat{2,1};
- Rational rat2{3,6};
- Rational rat3;
- cout << rat << endl;
- rat3+=rat;
- cout << rat3 << endl;
- rat3-=rat2;
- cout << rat3;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement