【发布时间】:2016-04-05 01:55:35
【问题描述】:
我的问题直接来自 CS 圈子网站。这是this 页面底部的最后一个问题,名为“Primed for Takeoff”。基本的概要是他们想要一个长度为 1,000,001 的列表,如果索引是素数,则每个项目的索引为 True,如果不是素数,则每个项目的索引为 False。
因此,例如,isPrime[13] 为 True。 isPrime[14] 为假。
列表“isPrime”的第一个部分看起来像:
isPrime = [False, False, True, True, False, True, False, True, False, False, ...]
我的问题是他们有 7 秒的时间限制。我在下面有一个工作代码,其编号为 101,用于调试目的。当我将它增加到他们要求的 1,000,001 列表长度时,它花费的时间太长了,几分钟后我最终杀死了该程序。 这是我的工作(长度为 101),代码非常慢:
n = 101
c = 2
isPrime = [False,False]
for i in range(2,n):
isPrime.append(i)
def ifInt(isPrime):
for item in isPrime:
if type(item) == int:
return item
for d in range(2,n):
if c != None:
for i in range(c,n,c):
isPrime[i] = False
isPrime[c] = True
c = ifInt(isPrime)
然后我找到了这个here。它的运行时间更快,但只输出素数列表,而不是长度为 n 的列表,其中 list[n] 对素数返回 True,否则返回 false。
我不确定这第二段代码是否真的是在 7 秒内创建长度为 1,000,001 的素数列表的关键,但这是我在研究中能找到的最相关的东西。
def primes_sieve1(limit):
limitn = limit+1
primes = dict()
for i in range(2, limitn): primes[i] = True
for i in primes:
factors = range(i,limitn, i)
for f in factors[1:]:
primes[f] = False
return [i for i in primes if primes[i]==True]
print primes_sieve1(101)
CS 圆圈似乎很常用,但我无法找到适用于 Python 的工作版本。希望这对某人来说是一个简单的解决方案。
这个问题与this one 不同,因为我不是试图只快速创建一个素数列表,而是创建一个从 0 到 n 的所有正整数的列表,这些正整数被 True 标记为素数,而 False 标记为非素数。
【问题讨论】:
-
您链接的代码中的答案实际上会在 7 秒内生成确切的数组。您应该尝试理解那段非常短的 sn-p 代码的作用。
-
return [i for i in primes if primes[i]==True]此行仅在索引 i 为质数时过滤质数列表。希望此提示对您有所帮助。 -
请注意,列出素数完全等同于您描述的真/假数组,并且很可能任何列出素数的程序只需要非常小的更改即可获得布尔数组。
-
@adhdj 我不确定如何以更清晰的方式重复此操作。您链接的答案产生了有问题的列表。
标签: python list computer-science