代码执行了对n的较小值应该做的事情,但是我想计算所有低于200万的质数的总和,以及代码似乎需要无穷无尽的时间。我正在使用PyScripter。有没有办法让这个代码更有效率?
def is_prime(a):
return all(a % i for i in range(2, a))
def sum_of_primes(n):
sum = 0
x = 2
while x < n:
if is_prime(x):
sum = sum + x
x = x+1
return sum
def main():
print(sum_of_primes(2000000))
if __name__ == '__main__':
main()
答案 0 :(得分:3)
Sieve of Eratosthenes是查找低于某个数字的所有素数的最佳算法之一。
基本上,您可以创建一个范围为2的布尔值列表,无论您想要什么数字。然后删除每个真值索引折叠的所有索引。比如在你开始搜索列表之后你遇到2并且你更新为假所有2 * n的索引然后你跳到3然后你更新所有3 * n索引为假。然后你跳过4,因为你已经将它更新为false。然后你来到5并将所有5 * n替换为false。结束等等。在和你会得到一个长列表,所有真值的索引都是素数。您可以根据需要使用此列表。
维基百科指出的基本算法是:
Let A be an array of Boolean values, indexed by integers 2 to n, initially all set to true. for i = 2, 3, 4, ..., not exceeding √n: if A[i] is true: for j = i2, i2+i, i2+2i, i2+3i, ..., not exceeding n: A[j] := false. Output: all i such that A[i] is true.