虽然我很欣赏@DonatPants了详细的解答,我认为,解决办法是太复杂了。首先,我们不需要计算sqrt()
,当更简单的平方会做(即方程两边的平方)。第二个测试顺序似乎是落后的,为什么在if number % prime == 0
之后检查prime > sqrt
?如果prime > sqrt
,你不需要其他测试。那布尔值是什么?我简单的方法解决这个问题:
primes = [2]
for number in range(3, 2000000 + 1, 2): # only test odd numbers
for prime in primes:
if prime * prime > number: # we're past sqrt, a prime!
primes.append(number)
break
if number % prime == 0: # a composite
break
print(sum(primes))
将冗余计算prime * prime
是一个低效率。它对这个数字范围并没有什么区别,但是如果需要的话,你可以保留一个单独的正方形数组,枚举素数并使用生成的索引来访问正方形,当你保存素数的时候可以保存这个正方形。只是将素数平方比所有数字的平方根便宜:
primes = [2]
squares = [4]
for number in range(3, 2000000 + 1, 2):
for index, prime in enumerate(primes):
if squares[index] > number:
primes.append(number)
squares.append(number * number)
break
if number % prime == 0:
break
print(sum(primes))
我们浪费空间来避免浪费时间。但是,再次,对于这个范围的数字,这是不值得的。
@ Jacobr365这是不正确的,中断进入'number + = 1'行,因此while循环的下一次迭代if语句将是'if 3%2 == 0',否则将执行。但y值永远不会改变 –
@ DonatPants谢谢。这就是我从手机进行编辑的结果。甚至没有注意到这条线。删除评论。 – Jacobr365
你的程序确实终止了,但是你没有给它足够的时间,我把if(primes [-1])> = 2000000:'改成if if(primes [-1])> = 200:'程序终止。让你的程序更高效,以便它能够工作。 –