Repository navigation
Expand file tree
/
Copy pathfraction.py
More file actions
72 lines (52 loc) · 1.76 KB
/
Copy pathfraction.py
File metadata and controls
72 lines (52 loc) · 1.76 KB
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
def gcd(a, b):
# a = q * b + r
if b == 0: return a
q = a // b
r = a - q * b
return gcd(b, r)
class Fraction:
def __init__(self, num, den=1):
if type(num) != int or type(den) != int:
raise Exception("Not ints")
d = gcd(num, den)
self.num = int(num / d)
self.den = int(den / d)
@staticmethod
def from_float(n):
for i in range(1, 100000):
if (n * i) % 1 == 0:
return Fraction(n * i, i)
def __str__(self):
return str(self.num) if self.den == 1 else f'({self.num}/{self.den})'
def eval(self):
return self.num / self.den
def reduced(self):
return Fraction(self.num, self.den)
def __add__(self, other):
if type(other) == int:
other = Fraction(other)
return Fraction(self.num * other.den + other.num * self.den, self.den * other.den)
def __radd__(self, other):
return self + other
def __sub__(self, other):
return self + -other
def __rsub__(self, other):
return -self + other
def __mul__(self, other):
if type(other) == int:
other = Fraction(other)
return Fraction(self.num * other.num, self.den * other.den)
def __rmul__(self, other):
return self * other
def __truediv__(self, other):
if type(other) == int:
other = Fraction(other)
return self * other.inv()
def __rtruediv__(self, other):
return other * self.inv()
def __pow__(self, other):
return Fraction(self.num ** other, self.den ** other)
def __neg__(self):
return Fraction(-self.num, self.den)
def inv(self):
return Fraction(self.den, self.num)