Python: Wrong output and ValueError: Prime Factors Creator

Python: Wrong output and ValueError: Prime Factors Creator

我创建了一个程序,可以成功检测一个数是否为素数,如果不是,它也会 return 列出该数的因数,但那部分不是成功的。

这是我的代码:

def prime_num():

    num = int(input("Give me a number...: "))
    prime = True

    if num == 1:
        prime = False
    elif num == 2:
        prime = True

    for x in range(2, num):
        if num % x == 0:
            prime = False
            break

    if prime == False:
        print("That's not a prime number!")
        factors(num)
    elif prime == True:
        print("That's a prime number!")


def factors(num):

    factors = []

    for x in range(1, num+1):
        if num % x == 0:
            factors.append(x)
    print("The factors for " + str(num) + " are: ", factors)

    for x in factors:
        for y in range(1, x):
            if x % y == 0:
                factors.remove(x)
    print("The prime factors for " + str(num) + " are: ", factors)

当我将此函数与 "num" 值 25 一起使用时,我得到此输出...

prime_num()

Give me a number...: 25
That's not a prime number!
The factors for 25 are:  [1, 5, 25]
The prime factors for 25 are:  [1, 25]

这不是质因数的正确输出,我只是希望它成为 return:[5] (我暂时不关心因素的多重性)

然而,当我尝试数字 50 时,作为我的 "num"。我得到这个带有 valueError 的输出:

prime_num()

Give me a number...: 50
That's not a prime number!
The factors for 50 are:  [1, 2, 5, 10, 25, 50]
Traceback (most recent call last):

  File "<ipython-input-19-12c785465e2a>", line 1, in <module>
   prime_num()

  File "C:/Users/x/Desktop/Python/Python Practice/primes.py", line 25, in prime_num
   factors(num)

  File "C:/Users/x/Desktop/Python/Python Practice/primes.py", line 40, in factors
   factors.remove(x)

ValueError: list.remove(x): x not in list

我意识到这意味着我的 x 不知何故不在因子中,但我不确定我是如何考虑具体迭代因子的。

这应该清楚你的问题是什么:

factors = [1,5,25]

for x in factors:
    for y in range(1,x):
        print x,y

5 1
5 2
5 3
5 4
25 1
25 2
25 3
25 4
25 5
25 6
25 7
25 8
25 9
25 10
25 11
25 12
25 13
25 14
25 15
25 16
25 17
25 18
25 19
25 20
25 21
25 22
25 23
25 24

您正在以忽略 1 并忽略 x % x 组合的方式迭代因子。 range(1,1) 是一个空列表,然后你就停止了 short 因为你已经将起点增加了 1(从零开始)而不是结束点,所以你迭代的内容太短了。

您得到 ValueError 的原因是因为任何非平方数(即不是 4、9、16、25 等)将被删除两次。例如,对于 6,它将删除 2,3 组合,当它到达 3,2 组合时,它已经被删除,因此出现错误。解决这个问题的一种方法是让代码只在一半时减去你的总数,这样反转的数字就不会被删除两次。例如6停在2,10停在4等