我知道如何使用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)
答案 0 :(得分:1)
你的问题是算法,而不是Python代码。如果x
(i> 1)除a
,则在x**i
除以a
时,您的程序会增加除数a
。在您的输出中,最后一个数字表示所有素数的乘积,这些乘数不止一次是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
的除数。您可以使用PythonTutor之类的调试器来查找您的程序不在哪里,您期望什么。
实际上,我只是想给你一个伪代码来改进你的算法,所以你可以实现这个算法。但后来我注意到,Python中的伪代码几乎相同:
{{1}}
现在,您可以尝试提高算法的效率,因为这种策略相当慢。