2013-10-05 33 views
1

此代码有什么问题?仅使用循环和if语句打印素数

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 

这里有什么问题?我不断收到复合数字。

回答

1

对于ž是一个素数,它必须是不存在任何数量情况下,这样2 <= a <= sqrt(z)一个ž的一个因素。我会将您的代码更改为:

import math 
y=1 
z=y 
while z>= 1 and z<1000 : 
    z= 2*y + 1 
    y=y+1 
    if all(z%a != 0 for a in range (2,int(math.sqrt(z) + 1))): 
     print(z) 
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的筛选,但这些是您可以实现的最基本的。

+0

我无法获得您的国旗声明...... ???我是一个初学者,我onli knw ..如果语句,while循环.. – sidchelseafan

+0

国旗只是一个变量。它存储0,如果该数字不可被从a到'range(2,int(math.sqrt(z)+1)'中的任何数字不可分割' '只要其中一个数字完全除以'如果z%a = = 0'该标志变为1. 只有当该标志为0时才是打印的数字,否则它可以被其他数字整除,因此不是质数。 – Sohaib

+0

不要忘记标记为正确/ upvote,如果找到它有用的。这就是这个社区的功能 – Sohaib