我写了一个程序,计算素数的总和为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/)
时查找素数如果我在哪里错了,请纠正我。谢谢。
答案 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))