-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRational Number.cpp
53 lines (46 loc) · 1.36 KB
/
Rational Number.cpp
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
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
// rational number implementation
struct rat {
ll num, den;
rat(ll num, ll den): num(num), den(den) {}
rat(ll a): rat(a, 1) {}
rat& norm() {
ll g = __gcd(num, den);
num /= g, den /= g;
return (*this);
}
friend rat operator+(rat a, rat b) {
return rat(a.num * b.den + b.num * a.den, a.den * b.den).norm();
}
friend rat operator-(rat a, rat b) {
return rat(a.num * b.den - b.num * a.den, a.den * b.den).norm();
}
friend rat operator*(rat a, rat b) {
return rat(a.num * b.num, a.den * b.den).norm();
}
friend rat operator/(rat a, rat b) {
return rat(a.num * b.den, a.den * b.num).norm();
}
friend bool operator<(rat a, rat b) {
return a.num * b.den < b.num * a.den;
}
friend bool operator>(rat a, rat b) {
return a.num * b.den > b.num * a.den;
}
friend bool operator==(rat a, rat b) {
return a.num * b.den == b.num * a.den;
}
friend bool operator<=(rat a, rat b) {
return a.num * b.den <= b.num * a.den;
}
friend bool operator>=(rat a, rat b) {
return a.num * b.den >= b.num * a.den;
}
friend ll floor(rat a) { return a.num / a.den; }
friend ll ceil(rat a) { return (a.num + a.den - 1) / a.den; }
explicit operator ll() { return num / den; }
explicit operator ld() { return (ld) num / den; }
};