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
相关产品推荐
相关产品推荐

