【问题标题】:Find sum of first 1000 prime numbers in python [duplicate]在python中查找前1000个素数的总和[重复]
【发布时间】:2015-06-19 11:50:27
【问题描述】:

我写了一个程序,计算素数之和直到 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/)

如果我在某些地方出错,请纠正我。谢谢。

【问题讨论】:

  • 不确定如何获得 O(n) 时间,尤其是在限制为 O(1) 空间的情况下。
  • @Anonymous,这个问题与此有很大关系,但它为 OP 提供了大量信息,但存在一些差异......
  • 埃拉托色尼筛法在恒定空间中找到素数,例如 n log n 时间,但它基本上限于最大值。
  • @jwilner:Eratosthenes 的筛子既不是常数空间也不是 n log n 时间。我不确定“从根本上链接到最大值”是什么意思,但是您可以逐步扩展列表,但效率不高。但是,您可以简单地估计第 1000 个素数并筛选出稍大的区间。
  • @DouglasZare:我认为“从根本上与最大值挂钩”是指我们可以在一开始就决定我们想要支持的数字范围(例如,最多 1000 万) .但我同意“恒定空间”和“n log n time”是一个常见的误解,我也经常这样做。我(我相信 jwilner)觉得它是恒定空间,因为一旦我们选择了某个上限(比如

标签: python algorithm data-structures primes


【解决方案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

【讨论】:

  • 答案应该是 b 3682913。我用上面的代码得到 2000..任何输入?谢谢
  • 抱歉,num 是素数时忘记加 1 :(
  • 还有一点,sum 是python的内置函数,使用它作为变量名会覆盖它。请注意这一点。
【解决方案2】:

代码:

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))

【讨论】:

    【解决方案3】:

    我希望提出以下算法(埃拉托色尼筛法)

    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)
    

    【讨论】:

    • 没问题,筛子的极限与n有关,通过素数的累积分布,如果n改变了,那么极限也是
    • 对于如此大的 n 值,筛分限制会很大,这会使算法非常非常非常低效
    【解决方案4】:

    完成您所要求的操作的最简单方法可能是使用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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多