0

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

for number in range(0, 1000):

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

4 回答 4

4

在您的脚本中,无论该数字是否可被 2 整除,它都会立即中断循环。我重新缩进了代码,这可能更接近你想要做的事情。

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

如果循环正常退出,则运行循环后的else关键字。所以只有在没有找到除数的情况下才会打印“是素数”部分。for

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"

你可以在这里看到这是一个动作: http ://codepad.org/XdS413LR

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

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

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

于 2013-09-05T03:46:11.600 回答
1

我想你想要这样的东西:

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

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

于 2013-09-05T03:48:38.623 回答
1

这里有一些替代方案。首先,这会检查素数:

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

这稍微快一些,但您应该有使用 yield 的经验:

def primes_plus():
yield 2
yield 3
i = 5
while True:
    yield i
    if i % 6 == 1:
        i += 2
    i += 2
于 2013-09-05T04:20:49.263 回答
1

这里有一些替代方案。

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)
于 2013-09-06T05:12:27.370 回答