Python 3.x 用“求一个数的素因子”;for loop";用python

Python 3.x 用“求一个数的素因子”;for loop";用python,python-3.x,for-loop,prime-factoring,Python 3.x,For Loop,Prime Factoring,我知道如何使用while循环来实现这一点,但我需要找到使用for循环的解决方案。对于给定的num=56,下面的代码输出[2,7,4],而正确的答案是[2,2,2,7]。我哪里做错了 def prime_fac(num): a = num pf = [] for x in range(2,a): if a % x == 0: if x == 2 or x == 3: pf.append(x)

我知道如何使用while循环来实现这一点,但我需要找到使用for循环的解决方案。对于给定的num=56,下面的代码输出
[2,7,4]
,而正确的答案是
[2,2,2,7]
。我哪里做错了

def prime_fac(num):
    a = num
    pf = []
    for x in range(2,a):
        if a % x == 0:
            if x == 2 or x == 3:
                pf.append(x)
                a = a//x
            else:
                for y in range(2,x):
                    if (x % y) == 0:
                        break
                else:
                    pf.append(x)
                    a = a // x
        else:
            continue
    if a>1:
        pf.append(a)
    print (f"Prime factors of {num} are {pf}")
number = int(input('Enter a number to find its prime factors: '))
prime_fac(number)

你的问题在于算法,而不是Python代码。如果
x**i
(i>1)除以
a
,则程序在除数
a
时会增加除数
x
。在输出中,最后一个数字表示所有素数的乘积,这些素数不止一次是
a
的除数。您可以使用调试器来找出您的程序没有找到的地方,以及您的期望

实际上,我只是想给你一些伪代码来改进你的算法,这样你就可以实现这个算法了。但后来我注意到,Python中的伪代码几乎相同:

def prime_fac(num):
    a = num
    pf = []
    #ranges in Python don't include the last element, therefore we need a + 1 to detect also prime numbers
    for x in range(2, a + 1):
        #check if x is divisor and repeat
        while a % x == 0:
            pf.append(x)
            a = a // x

        #all factors found?
        if a == 1:
            #yes, return list with prime factors
            return pf 
        #no, go to next x     
现在,您可以尝试提高算法的效率,因为这种策略相当缓慢