素数总和低于100万?

时间:2019-01-18 05:50:27

标签: python python-3.x

我想打印所有小于100万的质数,但是我的代码要花很多时间。还有其他方法可以更快地执行代码吗?

b=1
d = 0
#generates a list of numbers.
while b<1000000:
    b=b+1
    x = 0.0
    a = 0
    #generates a list of numbers less than b. 
    while x<b:
        x=x+1
        #this will check for divisors. 
        if (b/x)-int(b/x) == 0.0:
            a=a+1
    if a==2:
        #if it finds a prime it will add it.
        d=d+b
print(d) 

3 个答案:

答案 0 :(得分:2)

尝试这个简单的代码,它比您的代码快得多:)

import math

def isPrime(n):
   if n == 1:
      return False
   if n == 2:
      return True
   if n > 2 and n % 2 ==0:
      return False

   max_divisor = math.floor(math.sqrt(n))
   for d in range(3, 1 + max_divisor,2):
     if n % d ==0:
        return False
   return True

primes = [x for x in range(1,1000000) if isPrime(x) ==True]
print(sum(primes))

答案 1 :(得分:1)

Primality Test - Wikipedia

  

最简单的素数检验是试验划分:给定输入数字   n,检查从2到√n的素数m是否均分n

我将从定义一个仅检查数字是否为质数的函数开始。然后,在从3、5、7、9,...,999.999开始的循环中使用该函数,并检查每个数字是否为质数,如果匹配,则将其添加到sum变量中。

from math import sqrt

def is_prime(num):
    # According to trial division we only need to check from 2 -> sqrt(num)
    for x in range(2, int(sqrt(num) + 1)):
        if num % x == 0:
             return False
    return True

sum = 2 # Start with 2 in sum because we skip it to make life easier
for x in range(3, 1000000, 2): # Don't bother checking even numbers
    if is_prime(x):
        sum += x
print("Sum: " + str(sum))

在我的机器上,这大约需要10秒钟才能找到答案,这比您的实现要好得多。

答案 2 :(得分:1)

Sieve of Eratosthenes是一种非常基本且非常快速的素数测试算法。

以下实现在一台现代机器上大约需要400毫秒,但可能需要进一步优化。

limit = 1000000
is_prime = [x % 2 for x in range(limit)]
is_prime[1] = False
is_prime[2] = True
for candidate in range(3, limit, 2):
    if is_prime[candidate]:
        for product in range(candidate * 3, limit, candidate * 2):
            is_prime[product] = False
print(sum(x for x in range(limit) if is_prime[x]))