繁体   English   中英

为什么我的素数算法需要在for循环中休息?

[英]Why does my prime number algorithm need a break in the for loop?

我编写了一个算法,用前1000个素数填充列表。

当我像这样运行它时,它会用一些不是素数的数字填充列表。

def is_prime():
    primes = [2]
    a = 0
    x = 3
    while a < 999:
        for i in range(2, x):
            if (x % i) == 0:
                x += 2
                break
        else:
            primes.append(x)
            a += 1
            x += 2
    return primes


print is_prime()          

[为什么这个]需要在for循环中休息?

让我引用您可能想要查看的本教程

循环语句可能有一个else子句; 它是在循环通过列表耗尽 (with for)[...]而终止时执行的,但是当循环被break语句终止时不会执行。

这意味着在你的while -loop中,

 primes.append(x)
 a += 1
 x += 2

仅当for -loop遍历i in range(2, x)所有i in range(2, x)并且从未遇到过break时才执行。 (这意味着,没有找到x的除数)

如果没有 break语句,上面的代码将在while -loop的每次迭代中执行。 因此,如果没有break语句,每次找到x的除数时,只需将x2 ,并在达到range(2, x)结束时声明x为素数range(2, x) (请注意,在范围表达式中,它是原始的在开始添加2之前的x )。 这似乎适用于小数字,但与检查x是否有任何除数不同。

你的算法似乎工作。

例如,与更标准的方法进行比较:

def rwh_primes(n):
    """ Returns  a list of primes < n """
    sieve = [True] * n
    for i in xrange(3,int(n**0.5)+1,2):
        if sieve[i]:
            sieve[i*i::2*i]=[False]*((n-i*i-1)/(2*i)+1)
    return [2] + [i for i in xrange(3,n,2) if sieve[i]]

p0 = is_prime()  # OP's code
p1 = rwh_primes(7920)

print p0==p1   # prints True, so the lists are equal

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM