rational.py 1.9 KB

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