我是python的初学者,我在项目euler上遇到问题,要求我找到最大的素数。但是我的代码没有像我预期的那样工作,而且我得到的数字并不是一个素数。虽然我已经做了很长时间,但我仍然找不到问题。我的代码是
def is_prime(x):
for i in range(2,x):
if x%i==0:
return False
else:
return True
def largest_prime_factor(x):
a=range(1,x)
list1=[]
for i in a:
if x%i==0 and is_prime(i) == True:
list1.append(i)
print max(list1)
这里的任何人都可以告诉我为什么我的代码错了?提前谢谢你
答案 0 :(得分:2)
代码中有三个错误。一,已经指出:你应该在return True
的循环结束时is_prime
。另一个是1
不是素数:
def is_prime(x):
if x == 1:
# 1 is not prime!
return False
# you can loop up to ceil(sqrt(x)) instead of all the way up to x
for i in range(2, int(x**.5) + 1):
if x%i==0:
return False
elif i > x:
break
return True
另一个是largest_prime_factor
引发了素数的错误:
In [7]: largest_prime_factor(7)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-7-eceaf4811bfe> in <module>()
----> 1 largest_prime_factor(7)
<ipython-input-6-d40692628493> in largest_prime_factor(x)
12 if x%i==0 and is_prime(i):
13 list1.append(i)
---> 14 return max(list1)
ValueError: max() arg is an empty sequence
(如果您使用1
认为is_prime
是素数的1
的错误版本,则返回range(1, x)
问题是x
不包含largest_prime_factor
。因此,当x
为素数时,x
中的循环将无法将x
添加为因子。您应该遍历包含def largest_prime_factor(x):
list1=[]
for i in range(1, x+1):
if x%i==0 and is_prime(i):
list1.append(i)
return max(list1)
的范围:
sqrt(x)
然而,这是非常低效的。相反,您可以像is_prime
一样循环到x
,但是当您找到一个因子时,您可以划分from itertools import chain
def largest_prime_factor(x):
factors = []
for div in chain([2], range(3, int(x**.5) + 1, 2)):
while x % div == 0:
factors.append(div)
x //= div
if div > x:
break
if x != 1:
# return x # should be okay to do this because x was prime
factors.append(x)
return max(factors)
:
sqrt(x)
这样效率更高,因为它必须只循环到In [11]: largest_prime_factor(7)
Out[11]: 7
,并返回正确的结果:
{{1}}
答案 1 :(得分:0)
问题在于您的is_prime(x)
。它返回函数调用的第一个实例。因此,您可能希望将其存储为布尔值或执行某些返回逻辑,而不是返回True
或False
。它可能看起来像这样:
if x%i==0:
continue
else:
return False
然后在函数末尾返回True
,如果它到达那里。
答案 2 :(得分:0)
在循环中,只应该返回false,当尝试所有步骤时返回true。
def is_prime(x):
for i in range(2,x):
if x%i==0:
return False
return True
def largest_prime_factor(x):
a=range(1,x)
list1=[]
for i in a:
if is_prime(i):
list1.append(i)
print max(list1)