仅使用循环和if语句打印素数

时间:2013-10-05 15:08:16

标签: python-3.x

这段代码出了什么问题?

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

这里有什么问题?我不断在输出中得到复合数字。

2 个答案:

答案 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-1multiple of six+1的数字,这样可以提高效率。除了2和3之外,所有其他素数都可以在该范围内找到。

进一步改进将要求您维护一个数组并存储所有先前的素数,并且除以您正在检查的数字的平方根之下的所有素数。

还有更好的即兴创作,比如Eratosthenes和Atkins的筛选,但这些是你可以实施的最基本的。

答案 1 :(得分:1)

要使 z 成为素数,必须存在任何 的情况{{1和 a z 的一个因素。我将您的代码更改为:

2 <= a <= sqrt(z)