【问题标题】:Calculate the sum of all primes below two million - code takes too long [duplicate]计算低于 200 万的所有素数的总和 - 代码耗时太长 [重复]
【发布时间】:2018-03-14 18:39:42
【问题描述】:

对于较小的 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()

【问题讨论】:

标签: python


【解决方案1】:

Sieve of Eratosthenes 是查找低于某个数的所有素数的最佳算法之一。

基本上,您创建一个布尔值列表,其大小范围为 2 到您想要的任何数字。然后删除每个真值索引折叠的所有索引。例如,在您开始搜索列表后,您遇到了 2 并且您将 2*n 的所有索引更新为 false 然后跳转到 3 然后将所有 3*n 索引更新为 false。然后跳过 4,因为您已经将其更新为 false。然后你来到 5 并将所有 5*n 替换为 false。以此类推。在 and 你会得到一个很长的列表,所有的真值索引都是素数。您可以根据需要使用此列表。

维基百科指出的基本算法是:

 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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-31
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 2011-05-21
    相关资源
    最近更新 更多