CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutSign UpSign In
jackfrued

CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!

GitHub Repository: jackfrued/Python-100-Days
Path: blob/master/Day01-15/code/Day09/rational.py
Views: 729
1
"""
2
运算符重载 - 自定义分数类
3
4
Version: 0.1
5
Author: 骆昊
6
Date: 2018-03-12
7
"""
8
9
from math import gcd
10
11
12
class Rational(object):
13
14
def __init__(self, num, den=1):
15
if den == 0:
16
raise ValueError('分母不能为0')
17
self._num = num
18
self._den = den
19
self.normalize()
20
21
def simplify(self):
22
x = abs(self._num)
23
y = abs(self._den)
24
factor = gcd(x, y)
25
if factor > 1:
26
self._num //= factor
27
self._den //= factor
28
return self
29
30
def normalize(self):
31
if self._den < 0:
32
self._den = -self._den
33
self._num = -self._num
34
return self
35
36
def __add__(self, other):
37
new_num = self._num * other._den + other._num * self._den
38
new_den = self._den * other._den
39
return Rational(new_num, new_den).simplify().normalize()
40
41
def __sub__(self, other):
42
new_num = self._num * other._den - other._num * self._den
43
new_den = self._den * other._den
44
return Rational(new_num, new_den).simplify().normalize()
45
46
def __mul__(self, other):
47
new_num = self._num * other._num
48
new_den = self._den * other._den
49
return Rational(new_num, new_den).simplify().normalize()
50
51
def __truediv__(self, other):
52
new_num = self._num * other._den
53
new_den = self._den * other._num
54
return Rational(new_num, new_den).simplify().normalize()
55
56
def __str__(self):
57
if self._num == 0:
58
return '0'
59
elif self._den == 1:
60
return str(self._num)
61
else:
62
return '(%d/%d)' % (self._num, self._den)
63
64
65
if __name__ == '__main__':
66
r1 = Rational(2, 3)
67
print(r1)
68
r2 = Rational(6, -8)
69
print(r2)
70
print(r2.simplify())
71
print('%s + %s = %s' % (r1, r2, r1 + r2))
72
print('%s - %s = %s' % (r1, r2, r1 - r2))
73
print('%s * %s = %s' % (r1, r2, r1 * r2))
74
print('%s / %s = %s' % (r1, r2, r1 / r2))
75
76