在python中查找前1000个素数的和
我已经写了一个程序,计算素数加起来的上限为1000。计划如下:在python中查找前1000个素数的和,python,algorithm,data-structures,primes,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 +
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)(我知道其他方法也可以做到:-),比如“埃拉托斯提尼筛”和在迭代到sqrt(n)时寻找素数)
如果我在某些地方出错,请纠正我。谢谢。完成您请求的最简单方法可能是使用
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))
代码:
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))
只需根据您的代码进行一点小小的改进,即可找到
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
我希望提出以下算法(Eratosthenes筛法)
n=1000
极限筛=10000
素数=集合()
notPrimes=set()
i=2
虽然len(素数)不知道如何得到O(n)时间,特别是当被限制在O(1)空间时。@Anonymous,这个问题与此有很多关系,但它为OP提供了很多信息,但有一些不同……埃拉托斯提尼的筛子在常数空间中找到素数,什么,比如n log n time,但它基本上被限制在一个最大值上。@jwilner:Eratosthenes的筛既不是恒定的空间也不是n对数n时间。我不知道你所说的“基本上链接到一个最大值”是什么意思,但是你可以逐步扩展列表,它只是没有那么有效。然而,你可以简单地估计第1000个素数,并筛选出一个稍大的区间。@DouglasZare:我认为,通过“基本上与最大值相关”,jwilner指的是我们可以在开始时决定我们想要支持的数字范围(比如,高达10毫升)。但我同意“恒定空间”和“n log n time”是一个常见的误解,我也经常这样做。我(我相信jwilner)觉得这是一个常量空间,因为一旦我们选择了某个上限(比如答案应该是b 3682913)。我用上面的代码得到了2000。有什么输入吗?谢谢,当它是素数时,忘了将num
增加1:(还有一件事,sum
是python的一个内置函数,使用它作为变量名会覆盖它。请注意。没问题,筛子的极限与n有关,通过素数的累积分布,如果n发生变化,那么筛子的极限将是巨大的,因为n的值如此之大,它将使这个算法效率很低
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)