View difference between Paste ID: LYyz5bvv and 2U2wmf3Z
SHOW: | | - or go back to the newest paste.
1
#include <numeric>
2
#include <iostream>
3
4
using namespace std;
5
6
class Rational {
7
public:
8
    Rational() = default;
9
10
    Rational(int numerator)
11
        : numerator_(numerator)
12
        , denominator_(1) {
13
    }
14
15
    Rational(int numerator, int denominator)
16
        : numerator_(numerator)
17
        , denominator_(denominator) {
18
        Normalize();
19
    }
20
21
    int Numerator() const {
22
        return numerator_;
23
    }
24
25
    int Denominator() const {
26
        return denominator_;
27
    }
28
29
private:
30
    void Normalize() {
31
        if (denominator_ < 0) {
32
            numerator_ = -numerator_;
33
            denominator_ = -denominator_;
34
        }
35
        const int divisor = gcd(numerator_, denominator_);
36
        numerator_ /= divisor;
37
        denominator_ /= divisor;
38
    }
39
40
    int numerator_ = 0;
41
    int denominator_ = 1;
42
};
43
44
ostream& operator<<(ostream& output, Rational rational) {
45
    output << rational.Numerator() << "/"s << rational.Denominator();
46
    return output;
47
}
48
49
istream& operator>>(istream& input, Rational& rational) {
50
    int numerator, denominator;
51
    char fraction;
52
    input >> numerator >> fraction >> denominator;
53
    rational = Rational{numerator, denominator};
54
    return input;
55
}