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

Python二次求根公式(Quadratic Formula)索引依赖bug修复求助

二次方程求根代码鲁棒性优化方案

原代码问题分析

  • 参数提取逻辑脆弱:原代码通过固定索引取分割后列表元素的方式,完全依赖输入的空格、符号位置严格符合ax^2 + bx + c的格式,只要空格数量有差异、符号前后没有空格,就会出现索引越界、取值错误的问题。
  • 求根公式逻辑错误:原代码中根的计算顺序错误,cmath.sqrt(dis) / 2*a的运算优先级是先算除法再算乘法,等价于(√Δ / 2) * a,不符合二次求根公式(-b±√Δ)/(2a)的要求,会导致计算结果错误。
  • 复数根处理不合理:引入cmath库本身就支持负数开方得到复数根,原代码判断判别式小于0直接返回无实根的提示,浪费了cmath的特性。

优化后的完整代码

import re
import cmath

def get_coeff(term, default_sign=1):
    # 提取单项的系数,处理省略1/-1的情况
    match = re.match(r'([+-]?)\s*(\d*)\s*', term)
    sign = -1 if match.group(1) == '-' else 1
    num = match.group(2)
    return sign * int(num) if num else sign * default_sign

quadratic = input('Enter a quadratic equation (in the form of ax^2 + bx + c): ').strip()
# 正则匹配整个二次方程的三个项,无视空格差异
pattern = r'^\s*([+-]?\s*\d*\s*)x\^2\s*([+-]\s*\d*\s*)x\s*([+-]\s*\d+)\s*$'
match_res = re.match(pattern, quadratic)

if not match_res:
    print("输入格式不合法,请按照ax^2 + bx + c的格式输入")
else:
    a_term, b_term, c_term = match_res.groups()
    a = get_coeff(a_term)
    b = get_coeff(b_term)
    c = get_coeff(c_term, default_sign=0) # 常数项没有默认1,直接取数值
    
    def roots(a,b,c):
        dis = b*b - 4*a*c
        sqrt_dis = cmath.sqrt(dis)
        root1 = (-b + sqrt_dis) / (2 * a)
        root2 = (-b - sqrt_dis) / (2 * a)
        return root1, root2
    
    r1, r2 = roots(a,b,c)
    print(f"方程的两个根为:{r1},{r2}")

核心优化点

  • 用正则捕获组直接匹配三个系数的位置,完全无视输入中的空格差异,只要整体符合ax^2 + bx + c的结构就能正确提取参数,支持x^2-3x+2、-2x^2 + 5x - 3、+3x^2+7x+4等多种常见输入写法。
  • 补充了系数提取的特殊场景处理,支持省略1/-1的系数写法(比如x2的系数为1,-x2的系数为-1)。
  • 修复了求根公式的运算顺序错误,保证计算结果正确。
  • 增加了输入合法性校验,格式不符合要求时会输出友好提示,不会直接抛出异常崩溃。
  • 保留了cmath的复数计算特性,判别式小于0时会正常返回复数根,不需要额外返回错误提示。

内容的提问来源于stack exchange,提问作者Lelefel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 01:48:01