如何在Python类中手动实现分数约分功能?
手动实现分数化简的reduce方法
完全可以用while循环来实现,核心是用**欧几里得算法(辗转相除法)**手动计算分子和分母的最大公约数(GCD),再用分子分母分别除以这个公约数得到最简分数,同时还要处理符号问题保证分母始终为正数。
完整实现代码
class fraction: def __init__(self,numerator,denominator): self.numerator = numerator self.denominator = denominator self.reduce() def get_numerator(self): return self.numerator def get_denominator(self): return self.denominator def reduce(self): # 处理符号,确保分母为正 if self.denominator < 0: self.numerator = -self.numerator self.denominator = -self.denominator # 用while循环实现辗转相除法求最大公约数 a = abs(self.numerator) b = abs(self.denominator) while b != 0: a, b = b, a % b gcd = a # 分子分母除以最大公约数完成化简 self.numerator = self.numerator // gcd self.denominator = self.denominator // gcd def __str__(self): return str(self.numerator) + "/" + str(self.denominator)
测试验证
补充完整测试代码后运行:
x = fraction(4,6) y = fraction(2*7,7*2) z = fraction(13,14) a = fraction(13*2*7,14) print(x) # 输出:2/3 print(y) # 输出:1/1 print(z) # 输出:13/14 print(a) # 输出:13/1
关键逻辑说明
- 符号处理:如果分母为负,同时翻转分子和分母的符号,保证分数表示统一(比如
3/-4转为-3/4,-3/-4转为3/4)。 - 辗转相除法的while循环实现:通过不断取余数迭代,直到余数为0,此时的被除数就是最大公约数,迭代方式比递归更稳定,避免深度问题。
- 化简操作:用整数除法
//保证分子分母除以最大公约数后仍为整数,得到最简分数形式。
内容的提问来源于stack exchange,提问作者vanillapillow
相关产品推荐
相关产品推荐

