Python,对素数的错误答案

Python,对素数的错误答案,python,numbers,primes,break,Python,Numbers,Primes,Break,我在这段代码中得到了几个不正确的答案。例如,9显示为素数。我猜我的问题在于使用中断,但我似乎无法从逻辑上找出有人问我的这个简单代码的错误 for number in range(0, 1000): for x in range(2, number): if (number % x == 0): break else: print x break 在脚本中,无论数字是否可被

我在这段代码中得到了几个不正确的答案。例如,9显示为素数。我猜我的问题在于使用中断,但我似乎无法从逻辑上找出有人问我的这个简单代码的错误

for number in range(0, 1000):

    for x in range(2, number):
         if (number % x == 0):
             break
         else:
             print x
             break

在脚本中,无论数字是否可被2整除,它都会立即中断循环。 我重新修改了代码,这可能更接近于您试图执行的操作

在您的原始代码中,如果数字可以被2整除(范围(2,number)中的第一个数字),那么您将中断循环,如果它不可整除,您也将中断循环。因此,所有奇数,如9,看起来都像素数

如果循环正常退出,则运行
for
循环后的
else
关键字。因此,只有在未找到除数的情况下,才会打印“is prime”部分

for number in range(0,1000):
    for x in range(2,number):
        if(number % x == 0):
            print number,"divisible by",x
            break
    else:
        print number, "is prime"
你可以看到这是一个例子:

此外,这是一个幼稚的算法(不是对代码的批评,探索简单的算法是一个有用的研究),但您可以提高一点效率。从技术上讲,您只需要检查
数字
的平方根,因为任何大于平方根的数字都必须有一个小于平方根的补码,这应该已经遇到了。因此,代码中的逻辑可以更改为:

from math import sqrt
for number in range(0,1000):
    for x in range(2,int(sqrt(number/2))):
        # Rest of code as above.

也就是说,有很多方法可以优化质数的检查或发现,如果你有机会的话,这些方法值得研究。

我想你需要这样的方法:

for number in xrange(100):
    for i in range(2,number):
        if number % i == 0:
            break
    else:
         print number

这将遍历1-100中的每个数字,并检查是否有任何数字可被除1之外的任何数整除,但您需要
else:
语句位于内部for循环的外侧,因此如果它通过内部for循环而未找到除数,则检查其素数。首先,这将检查素数:

def check_for_prime(n):
if n == 1: return False
elif n == 2: return True
elif n%2 == 0: return False

# Elementary prime test borrowed from oeis.org/A000040.
odds = 3
while odds < n**.5+1:
    if n%odds == 0: return False
    odds += 2
return True

以下是一些备选方案。

n是要查找的范围之前的数字

n=100
for i in range(0,n):
    num = filter(lambda y :i % y == 0,(y for y in range(2,(i/2))))
    if num or i == 4:
        print "%s not a prime number" %(i)
    else:
        print "%s is a prime number" %(i)

感谢您的快速回答,也感谢您对旧代码的错误进行了非常透彻的解释。还感谢您提供了一种使代码更高效的方法。@Slimmons如果您好奇的话,在算法课程中经常使用的一种更有效的素数检测方法是,实际上您只需要检查sqrt(数字),不是数字/2。可能重复的
n=100
for i in range(0,n):
    num = filter(lambda y :i % y == 0,(y for y in range(2,(i/2))))
    if num or i == 4:
        print "%s not a prime number" %(i)
    else:
        print "%s is a prime number" %(i)