-
Notifications
You must be signed in to change notification settings - Fork 0
/
Fraction.h
138 lines (110 loc) · 2.85 KB
/
Fraction.h
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#ifndef INF_H
#define INF_H
const double INF = std::numeric_limits<float>::infinity();
#endif
#ifndef FRACTION_H
#define FRACTION_H
#include <algorithm>
#include <string>
#include <cstring>
#include <sstream>
#include <cmath>
class Fraction {
private:
long long _n, _d;
public:
Fraction(double fraction = 0) {
long long precision = 1000000L;
long rFrac = long(round(fraction * precision));
long gcd = std::__gcd(rFrac, long(precision));
this->_n = rFrac / gcd;
this->_d = precision / gcd;
}
Fraction(long long n, long long d) {
_n = n;
_d = d;
reduce();
}
// Getters y setters
inline long long numerator() const {
return _n;
}
inline void numerator(long long n) {
_n = n;
reduce();
}
inline long long denominator() const {
return _d;
}
inline void denominator(long long d) {
_d = d;
reduce();
}
// Functions
void reduce() {
if (_d != 0) {
long long gcd = std::__gcd(_n, _d);
_n /= gcd;
_d /= gcd;
_n = _d < 0 ? -_n : _n;
_d = _d < 0 ? -_d : _d;
}
else throw "Divide by zero exception";
}
// Operator overloading
Fraction &operator+=(const Fraction &fB) {
long long denA = this->_d;
long long denB = fB._d;
if (denA != 0 && denB != 0) {
long long lcm = (denA * denB) / std::__gcd(denA, denB);
this->_n = ((this->_n * lcm) / denA) + ((fB._n * lcm) / denB);
this->_d = lcm;
return *this;
}
throw "Divide by zero exception";
}
Fraction &operator-=(const Fraction &fB) {
Fraction fA = *this - fB;
*this = fA;
return *this;
}
friend Fraction operator-(Fraction fA, const Fraction &fB) {
fA += Fraction(-fB.numerator(), fB.denominator());
return fA;
}
friend Fraction operator+(Fraction fA, const Fraction &fB) {
fA += fB;
return fA;
}
Fraction &operator+=(const long long &number) {
this->_n += number * this->_d;
this->reduce();
return *this;
}
operator double() {
if (this->_d != 0) {
return this->_n / (this->_d * 1.0);
}
throw "Divide by zero exception";
}
friend Fraction operator*(Fraction fA, const long long &n) {
fA.numerator(fA._n * n);
return fA;
}
friend Fraction operator*(Fraction fA, const Fraction &fB) {
return Fraction(fA._n * fB._n, fA._d * fB._d);
}
friend Fraction operator+(Fraction fA, const long long &number) {
fA += number;
return fA;
}
bool operator<(const Fraction &fraction) {
return (this->_n * fraction._d) < (this->_d * fraction._n);
}
operator std::string() const {
std::stringstream ss;
ss << this->_n << '/' << this->_d;
return ss.str();
}
};
#endif