rational.py 1.6 KB
Newer Older
骆昊的技术专栏's avatar
骆昊的技术专栏 已提交
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
"""

运算符重载 - 自定义分数类

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))