CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!
CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!
Path: blob/master/Day01-15/code/Day09/rational.py
Views: 729
"""1运算符重载 - 自定义分数类23Version: 0.14Author: 骆昊5Date: 2018-03-126"""78from math import gcd91011class Rational(object):1213def __init__(self, num, den=1):14if den == 0:15raise ValueError('分母不能为0')16self._num = num17self._den = den18self.normalize()1920def simplify(self):21x = abs(self._num)22y = abs(self._den)23factor = gcd(x, y)24if factor > 1:25self._num //= factor26self._den //= factor27return self2829def normalize(self):30if self._den < 0:31self._den = -self._den32self._num = -self._num33return self3435def __add__(self, other):36new_num = self._num * other._den + other._num * self._den37new_den = self._den * other._den38return Rational(new_num, new_den).simplify().normalize()3940def __sub__(self, other):41new_num = self._num * other._den - other._num * self._den42new_den = self._den * other._den43return Rational(new_num, new_den).simplify().normalize()4445def __mul__(self, other):46new_num = self._num * other._num47new_den = self._den * other._den48return Rational(new_num, new_den).simplify().normalize()4950def __truediv__(self, other):51new_num = self._num * other._den52new_den = self._den * other._num53return Rational(new_num, new_den).simplify().normalize()5455def __str__(self):56if self._num == 0:57return '0'58elif self._den == 1:59return str(self._num)60else:61return '(%d/%d)' % (self._num, self._den)626364if __name__ == '__main__':65r1 = Rational(2, 3)66print(r1)67r2 = Rational(6, -8)68print(r2)69print(r2.simplify())70print('%s + %s = %s' % (r1, r2, r1 + r2))71print('%s - %s = %s' % (r1, r2, r1 - r2))72print('%s * %s = %s' % (r1, r2, r1 * r2))73print('%s / %s = %s' % (r1, r2, r1 / r2))747576