1

这是我制作的主要发电机。我应该能够生成最多 20000 个素数。它应该生成作为参数提供给它的素数数量。但是,它最多只能执行 11 次并停止 D:。谁能解释这里有什么问题?

def find_primes(limit):
    prime_holder = [2, 3, 5 ,7]
    divided_pass = 0
    for i in range(11, 20000):
        for j in range(0, len(prime_holder)):
            if i%prime_holder[j] != 0:
                divided_pass += 1
        if divided_pass == len(prime_holder):
            prime_holder.append(i)
            divided_pass = 0
        if len(prime_holder)-1 == limit:
            break
    return prime_holder

my_primes = find_primes(50)
for x in my_primes:
    print x;
raw_input()
4

2 回答 2

2

你需要divided_pass0每一个新的i.

def find_primes(limit):
    prime_holder = [2, 3, 5 ,7]
    for i in range(11, 20000):
        divided_pass = 0
        for j in range(0, len(prime_holder)):
            if i%prime_holder[j] != 0:
                divided_pass += 1
        if divided_pass == len(prime_holder):
            prime_holder.append(i)
        if len(prime_holder)-1 == limit:
            break
    return prime_holder

>>> print find_primes(50)
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233]

PS - 列表在 Python 中是可迭代的,所以你不需要做for j in range(len(...)),只需做for j in prime_holder: if i % j != 0. 有更好的实现来查找给定范围内的素数(您应该研究这些)。

如果遇到否,您还可以使用在其中执行部分的for-else构造。现在你的代码被简化为。elsebreak

def find_primes(limit):
    prime_holder = [2, 3, 5 ,7]
    for i in range(11, 20000):
        for j in prime_holder:
            if i%j == 0:
                break
        else:
            prime_holder.append(i)
        if len(prime_holder)-1 == limit:
            break
    return prime_holder
于 2013-08-04T13:06:35.087 回答
0

您应该在每个周期清除分值传递的值

def find_primes(limit):
    prime_holder = [2, 3, 5 ,7]
    divided_pass = 0
    for i in range(11, 20000):
        for j in range(0, len(prime_holder)):
            if i % prime_holder[j] != 0:
                divided_pass += 1
        if divided_pass == len(prime_holder):
            prime_holder.append(i)
        divided_pass = 0
        if len(prime_holder)-1 == limit:
            break
    return prime_holderdivided_pass
于 2013-08-04T13:17:13.513 回答