2015-09-23 16 views
-1

我试图做一个保理程序,但它似乎不适用于负数a-,b-和c-输入。PYTHON 3.0负数不能作为输入使用

from fractions import gcd 
factor = -1 
opp = 0 
number = 1 
success = 0 
a = int(input("a-value: ")) 
b = int(input("b-value: ")) 
c = int(input("c-value: ")) 
factors = [] 
d = 0 
e = 0 
while number <= abs(a*c): 
#Checking for multiples 
    if abs(a*c) % number == 0: 
     factor += 1 
     factors.append(number) 
    number += 1 
while (factor-opp) >= 0: 
#Checking for actual factors 
    d = int(factors[factor]) 
    e = int(factors[opp]) 
    if (abs(d+e) or abs(d-e)) == abs(b): 
     success += 1 
     break 
    else: 
     factor -= 1 
     opp += 1 

if success > 0: 

    if (d+e) == b: 
     e = e 
    elif (d-e) == b: 
     e -= 2*e 
    elif (e-d) == b: 
     d -= 2*d 
    elif (-d-e) == b: 
     d -= 2*d 
     e -= 2*e 
    #Figuring out the equation 
    if d % a == 0: 
     d /= a 
     f = 1 
    else: 
     f = a/gcd(d,a) 
     d /= gcd(d,a) 

    if e % a == 0: 
     e /= a 
     g = 1 
    else: 
     g = a/gcd(e,a) 
     e /= gcd(e,a) 
    #Displaying the answer 
    if d >= 0: 
     d = str("+" + str(int(d))) 
     if e >= 0: 
      e = str("+" + str(int(e))) 
     elif e < 0: 
      e = str(int(e)) 
    else: 
     d = str(int(d)) 
     if e >= 0: 
      e = str("+" + str(int(e))) 
     elif e < 0: 
      e = str(int(e)) 
    if f == 1: 
     if g == 1: 
      print ("(x" + d + ")(x" + e + ")") 
     else: 
      g = str(int(g)) 
      print ("(x" + d + ")(" + g + "x" + e + ")") 
    elif g == 1: 
     f = str(int(f)) 
     print ("(" + f + "x" + d + ")(x" + e + ")") 
    else: 
     f = str(int(f)) 
     g = str(int(g)) 
     print ("(" + f + "x" + d + ")(" + g + "x" + e + ")") 
else: 
    print("This equation cannot be factored into integers.") 

更具体地说,问题是该块内的某个地方,我想。我和报表打印测试了它:

while (factor-opp) >= 0: 
#Checking for actual factors 
    d = int(factors[factor]) 
    e = int(factors[opp]) 
    if (abs(d+e) or abs(d-e)) == abs(b): 
     success += 1 
     break 
    else: 
     factor -= 1 
     opp += 1 

我找遍:我的规划教材,网上搜索有关输入底片,应有尽有。我在这里做错了什么?

+1

你应该给它一个不起作用的示例输入。而你期望的是什么。 –

回答

1

好吧我能够重现您的问题,为一个简单的测试用例如 - a=1 , b=0, c=-4

的问题是该行 -

if (abs(d+e) or abs(d-e)) == abs(b): 

不检查是否abs(b)等于abs(d+e)abs(d-e),而是首先评估的(abs(d+e) or abs(d-e))的结果,这将返回第一个非零的结果,然后将其与abs(b)进行比较,因此对于负数,这不会正确评估结果。更改条件 -

​​

,或者您也可以使用一组 -

if abs(b) in {abs(d+e), abs(d-e)}:   #Though I doubt if using set would give any performance improvement because of the overhead of creating a set. 

演示更改后 -

a-value: 1 
b-value: 0 
c-value: -4 
(x+2)(x-2) 

a-value: 1 
b-value: -1 
c-value: -6 
(x-3)(x+2) 

一两件事,有,你没有考虑过3210,结果应该为-(x+2)(x+2),但当前程序的结果为(x+2)(x+2)

+0

谢谢!我只是希望他们能够将系数的GCF分解出来。 a = -1,b = -4,c = -4具有-1的公倍数,因此程序输出与a = 1,b = 4,c = 4相同。 – Ivy

+0

好酷,很高兴我可以帮助。如果问题已经解决,我想要求您接受答案(通过点击答案左侧的勾号),这对社区有帮助。 –