You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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已经是更新后的值,不是运算前的原始值,导致虚部计算结果错误。

以你给出的测试用例为例:

  1. 执行add后,实例c的值为5+i5,实例d的值固定为2+i2
  2. 计算乘法时,先算实部:5*2 - 5*2 = 0,此时self.real被修改为0
  3. 再算虚部时,错误使用了更新后的self.real=0计算:0*2 +5*2 =10,最终得到错误结果0+i10,而正确虚部应该是5*2 +5*2=20,正确结果为0+i20。

另外你的__init__方法存在潜在兼容问题:硬编码取字符串下标0和3位置的字符转数字,只能支持实部、虚部都是个位数的输入,遇到10+i3这类多位数的复数字符串会解析失败。

修复方案
  1. 修复乘法计算逻辑:计算前先把当前实例的原始实部、虚部存入临时变量,全程用临时变量完成公式计算,最后再把结果赋值给实例属性,避免计算过程中原始值被提前覆盖。
  2. (可选优化)优化复数字符串解析逻辑,用字符串拆分代替硬编码下标,支持多位数的实部、虚部解析。

修复后的完整代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 02:18:15