我正在尝试找到1000素数而我正在尝试这样做而不会欺骗记忆或其他代码。你能否告诉我,我的代码是完全正确的还是完全偏离了基础?
primes = []
num = 3
while (len(primes)) < 1000:
if num / 2 == 0:
num = num + 1
else:
x = num - 1
for z in range(2,x):
if num % z == 0 :
num = num + 1
else:
primes.append(num)
num = num + 1
print primes[1000]
答案 0 :(得分:1)
您遇到了一些问题(num / 2 == 0
应该是num % 2 == 0
) 1 ,但实际上,使用continue
和break
会真的有帮助。 e.g。
for z in range(2,x): # xrange would be a performance win on python2.x
if num % z == 0 :
num = num + 1
else:
primes.append(num)
num = num + 1
在这个循环中,你可能会发现自己增加num
一堆。实际上,你只想增加一次(继续下一个数字)。所以,在你增加它之后,你想要break
。此外,else
语句需要位于for
循环:
for z in range(2, x):
if num % z == 0:
break # exit the for loop, don't execute `else` clause.
else:
# only executes if `break` was never encountered.
primes.append(num)
# This happens no matter what and should only happen once
# Might as well pull it out of the loop.
num += 1
1 在2处检查可除性是有用的 - 它是循环的第一次迭代。如果您使用了xrange
(对于python2.x)和break
,那么这种优化(可能)并不值得。
旁白:你真的不需要从2
到N - 1
运行循环,你实际上可以从2
到{{1}运行循环这使得这个批次更有效:-)虽然仍然不是你能做到的最好的... Sieve of Eratosthenes是另一种更有效地做到这一点的算法,可能甚至比那更好的方法(虽然我和#39;我不是这方面的专家)