问题描述
primef = []
def i_prime(n) :
count = 0
for i in range ( 0,n ):
for j in range ( 2,i ):
if (not i % j == 0):
yield i
count += 1
else:
break
for i in i_prime(45):
primef.append(i)
primefe = list(set(primef))
print(primefe)
解决方法
您的逻辑似乎有些缺陷。您实际上制作的是一个奇数生成器(考虑为什么)。既然已经回答了该部分,这里有一些提示:
- 我不建议这种算法生成素数
效率低下。您也可以缓存所有产生的素数
列表中的数字,并且仅对照该列表而不是
for j in range(2,i):
。 - 还有一种更有效的方法来生成质数
利用数论的事实,即所有素数
大于3的数字采用
6k+1
或6k+5
的形式,其中k为整数,出于实际目的,该值非负(后面的解释非常简单)。 这是我在解决Project Euler问题时编写的一段代码:
def is_prime(x: int) -> bool:
if x <= 3:
return x > 1
elif x % 2 == 0 or x % 3 == 0:
return False
i = 5
while i*i <= x:
if x % i == 0 or x % (i + 2) == 0:
return False
i = i + 6
return True
这个素数检查器对我有用,可以在0.6s内找到10001st素数(对于欧拉计画问题)。
如果有任何关于此实现的问题,请问我。
,这是您代码的正确版本-您需要仔细研究所有可能的因素,然后再确定数字不是质数-只要有一个数字不等于质数,您就yield
输入值除以。
primef = []
def i_prime(n) :
for i in range ( 0,n ):
for j in range ( 2,i ):
if (i % j == 0):
break
else:
yield i
for i in i_prime(45):
primef.append(i)
print(primef)