Python自定义Complex类复数乘法运算输出错误问题排查
问题根因
复数乘法运算逻辑存在变量覆盖错误:
- 复数乘法公式为
(a+bi)*(c+di) = (ac-bd) + (ad+bc)i,计算新虚部ad+bc时需要用到运算前的原始实部a和原始虚部b - 现有代码先执行
self.real = self.real * another.real - self.complex * another.complex,直接把self.real改成了新的实部值,后续计算虚部时,用到的self.real已经是更新后的值,不是运算前的原始值,导致虚部计算结果错误。
以你给出的测试用例为例:
- 执行
add后,实例c的值为5+i5,实例d的值固定为2+i2 - 计算乘法时,先算实部:
5*2 - 5*2 = 0,此时self.real被修改为0 - 再算虚部时,错误使用了更新后的
self.real=0计算:0*2 +5*2 =10,最终得到错误结果0+i10,而正确虚部应该是5*2 +5*2=20,正确结果为0+i20。
另外你的__init__方法存在潜在兼容问题:硬编码取字符串下标0和3位置的字符转数字,只能支持实部、虚部都是个位数的输入,遇到10+i3这类多位数的复数字符串会解析失败。
修复方案
- 修复乘法计算逻辑:计算前先把当前实例的原始实部、虚部存入临时变量,全程用临时变量完成公式计算,最后再把结果赋值给实例属性,避免计算过程中原始值被提前覆盖。
- (可选优化)优化复数字符串解析逻辑,用字符串拆分代替硬编码下标,支持多位数的实部、虚部解析。
修复后的完整代码:
class Complex: def __init__(self, num): # 按+i拆分字符串,兼容多位数实部虚部 real_part, imag_part = num.split("+i") self.real = int(real_part) self.complex = int(imag_part) def printcomplex(self): print(f"{self.real}+i{self.complex}") def add(self, other_complex): self.real = self.real + other_complex.real self.complex = self.complex + other_complex.complex def multiply(self, another): # 提前保存运算前的原始值 orig_real = self.real orig_imag = self.complex self.real = orig_real * another.real - orig_imag * another.complex self.complex = orig_real * another.complex + orig_imag * another.real c = Complex("3+i3") d = Complex("2+i2") c.add(d) c.printcomplex() c.multiply(d) c.printcomplex()
运行后输出:
5+i5 0+i20
符合复数运算的正确结果。
内容的提问来源于stack exchange,提问作者Monk_1o1
相关产品推荐
相关产品推荐

