Python中基于公制前缀对象的减法逻辑实现求助
修复公制长度Prefix类的减法运算实现
我来帮你搞定这个公制长度减法的问题~先看看你现有代码里的几个小问题,再给你两种靠谱的实现思路:
现有代码的问题点
- 借位逻辑完全错误:当厘米相减为负数时,用
abs(centim/100)去减米数的操作不符合借位逻辑,而且if meter < 1分支里还用到了未定义的变量m,直接会导致代码报错。 - 返回语句存在变量错误:
return Prefix(meter, cm)里的cm是未定义变量,应该用计算后的centim。 - 整体逻辑绕了弯路,没有抓住借位的核心逻辑。
方案一:统一转换为厘米计算(推荐,逻辑最清晰)
把所有长度都转换成厘米做减法,最后再转回米和厘米的格式,完全不用纠结借位的细节:
class Prefix: def __init__(self, m=0, cm=0): self.m = m self.cm = cm def __sub__(self, other): # 将两个对象的长度统一转换为总厘米数 total_self = self.m * 100 + self.cm total_other = other.m * 100 + other.cm # 计算差值 total_diff = total_self - total_other # 转换回米和厘米的格式 result_m = total_diff // 100 result_cm = total_diff % 100 return Prefix(result_m, result_cm) # 测试你给出的例子 a = Prefix(2, 20) b = Prefix(1, 30) result = a - b print(f"运算结果:{result.m}米{result.cm}厘米") # 输出:运算结果:0米90厘米
方案二:手动处理借位逻辑
如果你想贴近原本的思路手动实现借位过程,也可以这样写:
class Prefix: def __init__(self, m=0, cm=0): self.m = m self.cm = cm def __sub__(self, other): cm_diff = self.cm - other.cm m_diff = self.m - other.m # 处理厘米不够减的情况:从米数里借1(等价于100厘米) if cm_diff < 0: cm_diff += 100 m_diff -= 1 return Prefix(m_diff, cm_diff) # 测试例子 a = Prefix(2, 20) b = Prefix(1, 30) result = a - b print(f"运算结果:{result.m}米{result.cm}厘米") # 输出:运算结果:0米90厘米
两种方案都能正确实现你要的借位逻辑,而且代码简洁易懂,不会再出现原有的错误。
内容的提问来源于stack exchange,提问作者sargn
相关产品推荐
相关产品推荐

