chemical_equation_balancer/fraction.py

118 lines
3.3 KiB
Python
Raw Normal View History

2022-12-10 16:30:23 +08:00
class Fraction:
"""
代表分数的类包含分子和分母
提供加减乘除运算
"""
def __init__(self, top, bottom):
self.num = top
self.den = bottom
def __str__(self):
return str(self.num) + "/" + str(self.den)
def __add__(self, otherfraction):
newnum = self.num * otherfraction.den + self.den * otherfraction.num
newden = self.den * otherfraction.den
return Fraction(newnum, newden)
def __sub__(self, otherfraction):
newnum = self.num * otherfraction.den - self.den * otherfraction.num
newden = self.den * otherfraction.den
return Fraction(newnum, newden)
def __mul__(self, otherfraction):
newnum = self.num * otherfraction.num
newden = self.den * otherfraction.den
return Fraction(newnum, newden)
def __truediv__(self, otherfraction):
newnum = self.num * otherfraction.den
newden = self.den * otherfraction.num
return Fraction(newnum, newden)
def __eq__(self, otherfraction):
firstnum = self.num * otherfraction.den
secondnum = otherfraction.num * self.den
return firstnum == secondnum
def __gt__(self, otherfraction):
firstnum = self.num * otherfraction.den
secondnum = otherfraction.num * self.den
return firstnum > secondnum
def __lt__(self, otherfraction):
firstnum = self.num * otherfraction.den
secondnum = otherfraction.num * self.den
return firstnum < secondnum
def __ge__(self, otherfraction):
firstnum = self.num * otherfraction.den
secondnum = otherfraction.num * self.den
return firstnum >= secondnum
def __le__(self, otherfraction):
firstnum = self.num * otherfraction.den
secondnum = otherfraction.num * self.den
return firstnum <= secondnum
def __ne__(self, otherfraction):
firstnum = self.num * otherfraction.den
secondnum = otherfraction.num * self.den
return firstnum != secondnum
def get_num(self):
return self.num
def get_den(self):
return self.den
def __radd__(self, otherfraction):
return self
# 约分函数:将分数约分为最简分数
def reduce_fraction(fraction):
"""
将分数约分为最简分数
:param fraction: 分数Fraction 类型
:return: 约分后的分数Fraction 类型
"""
# 求最大公约数
def gcd(a, b):
if b == 0:
return a
else:
return gcd(b, a % b)
g = gcd(fraction.get_num(), fraction.get_den())
return Fraction(fraction.get_num() // g, fraction.get_den() // g)
# 通分函数:将多个分数通分
def common_denominator(fractions):
"""
将多个分数通分
:param fractions: 分数列表Fraction 类型
:return: 通分后的分数列表Fraction 类型
"""
# 求最大公约数
def gcd(a, b):
if b == 0:
return a
else:
return gcd(b, a % b)
# 求最小公倍数
def lcm(a, b):
return a * b // gcd(a, b)
# 通分
denominator = 1
for fraction in fractions:
denominator = lcm(denominator, fraction.get_den())
for i in range(len(fractions)):
fractions[i] = Fraction(fractions[i].get_num() * denominator // fractions[i].get_den(), denominator)
return fractions