【发布时间】: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