在python中找到前1000个素数的总和

时间:2015-04-14 01:26:55

标签: python algorithm data-structures primes

我写了一个程序,计算素数的总和为1000.该程序如下:

limit = 1000

def is_prime(n):
    for i in range(2, n):
        if n%i == 0:
            return False
    return True

sum = 0
for i in range(2, int(limit+1)):
    if is_prime(i):
        sum = sum + i
        count += 1
print sum

我可以进行哪些更改来查找1000个素数而不是最多1000个数字?此外,我正在寻找空间复杂度为O(1)和时间复杂度为O(n)(我知道其他方法可以做到:-),例如" Eratosthenes筛选"并在迭代到sqrt(n)http://www.geeksforgeeks.org/print-all-prime-factors-of-a-given-number/

时查找素数

如果我在哪里错了,请纠正我。谢谢。

4 个答案:

答案 0 :(得分:1)

代码:

def f():
    i = 2
    while True:
        if all(i % x != 0 for x in range(2, i-1)):
            yield i
        i += 1

primes = f()
print sum(primes.next() for _ in range(1000))

或者一个班轮:

import itertools
print sum(itertools.islice(itertools.ifilter(lambda x: all(x % i != 0 for i in range(2, x)), f()), 0, 1000))

答案 1 :(得分:1)

根据您的代码进行一项小改进,以找到limit素数而不是limit数字。

limit = 1000

def is_prime(n):
    for i in range(2, n):
        if n%i == 0:
            return False
    return True

sum = 0
num = 2
for i in xrange(limit):
    while not is_prime(num):
        num += 1
    sum += num
    num += 1 # sorry, miss this
print sum

你在寻找一些你感兴趣的东西时也可以使用一个循环,这可能只是一个品味问题。

limit = 1000

def is_prime(n):
    for i in range(2, n):
        if n%i == 0:
            return False
    return True

sum = 0
count = 0
num = 2
while count != limit:
    if is_prime(num):
        sum += num
        count += 1
    num += 1

print sum

答案 2 :(得分:0)

我希望提出以下算法(Eratosthenes筛选)

n=1000
limit_sieve = 10000
primes = set()
notPrimes = set()
i = 2
while len(primes)<n:
  if not i in notPrimes:
    primes.add(i);
    for notPrime in range(i*2, limit_sieve, i):
      notPrimes.add(notPrime)
  i+=1

sum(primes)

答案 3 :(得分:-1)

执行所请求的最简单方法可能是itertools

def gen_primes():
    for i in itertools.count(2):
        if is_prime(i):
            yield i 

first_one_thousand = list(itertools.islice(gen_primes(), 1000))

拍摄,每个人都喜欢单行:

first_one_thousand = list(itertools.islice((i for i in itertools.count(2) 
                                            if is_prime(i)), 
                                           1000))