-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrational_lib.cc
56 lines (46 loc) · 1.08 KB
/
rational_lib.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include "rational.hh"
using namespace std;
namespace rational {
namespace {
int max_absv(int i, int j) {
int a = abs(i);
int b = abs(j);
return (a >= b ? a : b);
}
int min_absv(int i, int j) {
int a = abs(i);
int b = abs(j);
return (a >= b ? b : a);
}
} // namespace
int GCD(int i, int j) {
if ((0 == i) || (0 == j)) {
return 1;
}
if (i == j) {
return i;
}
int divided = max_absv(i, j), divisor = min_absv(i, j);
int ratio = divided / divisor;
int remainder = divided - (ratio * divisor);
if (0 == remainder) {
return divisor;
} else {
return GCD(divided, remainder);
}
}
Rational::Rational(int i, int j) {
if (0 == j) {
throw invalid_argument("0 is an illegal denominator value.");
}
int gcd = GCD(i, j);
numerator_ = i / gcd;
denominator_ = j / gcd;
}
bool Rational::operator<(const Rational &r) const {
return ((numerator_ / denominator_) < (r.numerator_ / r.denominator_));
}
bool Rational::operator>(const Rational &r) const {
return ((numerator_ / denominator_) > (r.numerator_ / r.denominator_));
}
} // namespace rational