这段代码出了什么问题?
import math
y=1
z=y
while z>= 1 and z<1000 :
z= 2*y + 1
y=y+1
for a in range (2,int(math.sqrt(z) + 1)):
if z%a != 0:
print(z)
else:
break
这里有什么问题?我不断在输出中得到复合数字。
答案 0 :(得分:1)
您正在打印一个数字,即使它不能被一个数字整除,但可以被另一个数字整除。
打印应该在循环之外。
import math
y=1
z=y
while z>= 1 and z<1000 :
z= 2*y + 1
y=y+1
flag=0
for a in range (2,int(math.sqrt(z) + 1)):
if z%a == 0:
flag=1
break
if flag==0:
print z
另一种改进算法的方法是以6的倍数移动并检查multipleofsix-1
和multiple of six+1
的数字,这样可以提高效率。除了2和3之外,所有其他素数都可以在该范围内找到。
进一步改进将要求您维护一个数组并存储所有先前的素数,并且除以您正在检查的数字的平方根之下的所有素数。
还有更好的即兴创作,比如Eratosthenes和Atkins的筛选,但这些是你可以实施的最基本的。
答案 1 :(得分:1)
要使 z 成为素数,必须存在任何 的情况{{1和 a 是 z 的一个因素。我将您的代码更改为:
2 <= a <= sqrt(z)