-2

这试图分解,我以这种方式编写代码,因为我打算更改一些功能以允许更多功能,但我想知道为什么我的 xneg 和 xpos 的结果都是 0。

import math
sqrt = math.sqrt
equation = input("Enter the equation in the form x^2 + 5x + 6 :  ")
x2coe = 0
xcoe = 0
ecoe = 0
counter = -1
rint = ''

for each in range(len(equation)+1):
    if equation[each] == 'x':
        break
    x2coe = int(equation[each])
    counter = counter + 1

for each in range(len(equation)):
    if equation[each] == 'x':
        break
    xcoe = int(equation[counter + 5:counter + 6])

ecoe = int(equation[len(equation) - 1])

if x2coe == 0:
        x2coe = 1
if xcoe == 0:
        xcoe = 1

xpos = (-xcoe+sqrt((xcoe**2)-4*(x2coe*ecoe)))/(2*x2coe)
xneg = (-xcoe-sqrt((xcoe**2)-4*(x2coe*ecoe)))/(2*x2coe)

print("Possible Solutions")
print("-----------------------------------------------")
print("X = {0}".format(xpos))
print("X = {0}".format(xneg))
print("-----------------------------------------------")
4

2 回答 2

3

这是因为当您进行 xpos 和 xneg 的计算时,您的 x2coe 和 xcoe 变量都为 0。除了看起来像另一个问题之外,您将收到除以零的结果。xpos 和 xneg 表达式看起来像二次公式,但您要除以 2,然后在最后乘以 x2coe。乘法和除法具有相同的优先级,并且从左到右分组,因此您需要使用以下之一:

xpos = (-xcoe+sqrt((xcoe**2)-4*(x2coe*ecoe)))/(2*x2coe) # one way to fix
xneg = (-xcoe-sqrt((xcoe**2)-4*(x2coe*ecoe)))/2/x2coe # another, slower way

我建议您首先调试程序的“业务”逻辑,然后将三个系数作为元组或列表输入。

x2coe, xcoe, ecoe = eval(input("Enter coefficients of ax^2+bx+c as a,b,c: "))

当您的因式分解代码给出您想要的结果时,然后返回并放入一个花哨的输入处理程序。

提示:import re。正则表达式是这样简单解析的好工具。(如果有一天你想处理括号/括号/大括号,你将需要更高级的东西。)首先查看http://docs.python.org/3.3/howto/regex.html上的操作文档,并在http://docs.python.org/3.3/library/re.html为 re 模块文档添加书签

于 2013-09-14T21:52:18.910 回答
2

问题可能是您正在硬编码您认为每个系数应该是多长时间:1 位数。您应该使用另一个使其更灵活的功能。任何系数都可以为空,在这种情况下,A 或 B 应假定为 1,C 应假定为 0。

希望这会有所帮助:

p = re.compile('\s*(\d*)\s*x\^2\s*\+\s*(\d*)\s*x\s*\+\s*(\d*)\s*')
A, B, C = p.match(equation).group(1, 2, 3)
print(A, B, C)

的所有实例\s*都允许输入的灵活性,因此空格不会杀死您。

于 2013-09-14T22:37:58.073 回答