这是我制造的主要发电机。我应该能够生成高达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()
答案 0 :(得分:2)
您需要为每个新divided_pass
将0
设置回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]
P.S - 列表在Python中是可迭代的,因此您无需执行for j in range(len(...))
,只能执行for j in prime_holder: if i % j != 0
。有更好的实现来查找给定范围内的素数(你应该研究那些)。
如果没有遇到for-else
,您还可以使用else
部分执行break
部分。现在你的代码减少到了。
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
答案 1 :(得分:0)
你应该在每个周期清除 divide_pass 的值:
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