View difference between Paste ID: DvrSbZQ6 and t7FvJQRE
SHOW: | | - or go back to the newest paste.
1
#include <iostream>
2
#include <numeric>
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
16
    Rational(int numerator, int denominator)
17
        : numerator_(numerator)
18
        , denominator_(denominator)
19
    {
20
        Normalize();
21
    }
22
23
    int Numerator() const {
24
        return numerator_;
25
    }
26
27
    int Denominator() const {
28
        return denominator_;
29
    }
30
31
private:
32
    void Normalize() {
33
        if (denominator_ < 0) {
34
            numerator_ = -numerator_;
35
            denominator_ = -denominator_;
36
        }
37
        int n = gcd(numerator_, denominator_);
38
        numerator_ /= n;
39
        denominator_ /= n;
40
    }
41
42
    int numerator_ = 0;
43
    int denominator_ = 1;
44
};
45
46
ostream& operator<<(ostream& output, Rational rational) {
47
    output << rational.Numerator() << '/' << rational.Denominator();
48
    return output;
49
}
50
51
istream& operator>>(istream& input, Rational& rational) {
52
    int numerator, denominator;
53
    char slash;
54
    input >> numerator >> slash >> denominator;
55
    rational = Rational{numerator, denominator};
56
    return input;
57
}
58
59
Rational operator+(Rational r) {
60
    return r;
61
}
62
63
64
Rational operator-(Rational r) {
65
    return {-r.Numerator(), r.Denominator()};
66
} 
67
68
Rational operator+(Rational left, Rational right) {
69
    const int numerator = left.Numerator() * right.Denominator() 
70
                  + right.Numerator() * left.Denominator();
71
    const int denominator = left.Denominator() * right.Denominator();
72
73
    return {numerator, denominator};
74
} 
75
76
Rational operator-(Rational left, Rational right) {
77
    const int numerator = left.Numerator() * right.Denominator() 
78
                  - right.Numerator() * left.Denominator();
79
    const int denominator = left.Denominator() * right.Denominator();
80
81
    return {numerator, denominator};
82
}