更新
This commit is contained in:
76
Python-100-Days/Day01-15/Day09/rational.py
Normal file
76
Python-100-Days/Day01-15/Day09/rational.py
Normal file
@@ -0,0 +1,76 @@
|
||||
"""
|
||||
|
||||
运算符重载 - 自定义分数类
|
||||
|
||||
Version: 0.1
|
||||
Author: 骆昊
|
||||
Date: 2018-03-12
|
||||
|
||||
"""
|
||||
|
||||
from math import gcd
|
||||
|
||||
|
||||
class Rational(object):
|
||||
|
||||
def __init__(self, num, den=1):
|
||||
if den == 0:
|
||||
raise ValueError('分母不能为0')
|
||||
self._num = num
|
||||
self._den = den
|
||||
self.normalize()
|
||||
|
||||
def simplify(self):
|
||||
x = abs(self._num)
|
||||
y = abs(self._den)
|
||||
factor = gcd(x, y)
|
||||
if factor > 1:
|
||||
self._num //= factor
|
||||
self._den //= factor
|
||||
return self
|
||||
|
||||
def normalize(self):
|
||||
if self._den < 0:
|
||||
self._den = -self._den
|
||||
self._num = -self._num
|
||||
return self
|
||||
|
||||
def __add__(self, other):
|
||||
new_num = self._num * other._den + other._num * self._den
|
||||
new_den = self._den * other._den
|
||||
return Rational(new_num, new_den).simplify().normalize()
|
||||
|
||||
def __sub__(self, other):
|
||||
new_num = self._num * other._den - other._num * self._den
|
||||
new_den = self._den * other._den
|
||||
return Rational(new_num, new_den).simplify().normalize()
|
||||
|
||||
def __mul__(self, other):
|
||||
new_num = self._num * other._num
|
||||
new_den = self._den * other._den
|
||||
return Rational(new_num, new_den).simplify().normalize()
|
||||
|
||||
def __truediv__(self, other):
|
||||
new_num = self._num * other._den
|
||||
new_den = self._den * other._num
|
||||
return Rational(new_num, new_den).simplify().normalize()
|
||||
|
||||
def __str__(self):
|
||||
if self._num == 0:
|
||||
return '0'
|
||||
elif self._den == 1:
|
||||
return str(self._num)
|
||||
else:
|
||||
return '(%d/%d)' % (self._num, self._den)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
r1 = Rational(2, 3)
|
||||
print(r1)
|
||||
r2 = Rational(6, -8)
|
||||
print(r2)
|
||||
print(r2.simplify())
|
||||
print('%s + %s = %s' % (r1, r2, r1 + r2))
|
||||
print('%s - %s = %s' % (r1, r2, r1 - r2))
|
||||
print('%s * %s = %s' % (r1, r2, r1 * r2))
|
||||
print('%s / %s = %s' % (r1, r2, r1 / r2))
|
||||
Reference in New Issue
Block a user