我想打印所有小于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)
答案 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)
最简单的素数检验是试验划分:给定输入数字 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]))