Python 正在查看prime sieve程序,但不确定为什么它总是出现关于切片长度的错误
问题发生在第5行,我知道实现Python 正在查看prime sieve程序,但不确定为什么它总是出现关于切片长度的错误,python,python-2.7,primes,sieve,Python,Python 2.7,Primes,Sieve,问题发生在第5行,我知道实现[False]*((n-I*I-1)/(2*I)+1)是可行的,但我不确定原因。您试图用一个元素替换切片覆盖的所有元素: def primes(n): sieve = [True] * n for i in xrange(3,int(n**0.5)+1,2): if sieve[i]: sieve[i*i::2*i]=[False] print [2] + [i for i in xrange(3,n,2
[False]*((n-I*I-1)/(2*I)+1)
是可行的,但我不确定原因。您试图用一个元素替换切片覆盖的所有元素:
def primes(n):
sieve = [True] * n
for i in xrange(3,int(n**0.5)+1,2):
if sieve[i]:
sieve[i*i::2*i]=[False]
print [2] + [i for i in xrange(3,n,2) if sieve[i]]
primes(int(raw_input("Please enter an upper limit ")))
这将从列表中删除元素,但Python仅允许在不使用跨步的情况下用更少或更多的元素替换切片(如果该部分是连续的,则允许这样做)。无论哪种方式,您都希望用右侧相同数量的元素替换所有这些元素,以便可以将筛中的这些位置设置为False
为此,您需要调整右侧的列表,以便有足够的元素替换每个切片的元素:
sieve[i*i::2*i] = [False]
该公式计算切片在基于0的索引系统中覆盖的元素数n-1
是最高的索引,减去起始索引,得到一些受影响的元素,除以步幅,再加上1,因为步幅包括第一个元素
Python的xrange()
对象(range()
在Python 3中)使
Else对于步骤>0,如果n个值在范围内,则最后一个值为
lo+(n-1)*阶跃,必须为
sieve[i*i::2*i] = [False] * (((n - 1 - i*i) // (2 * i)) + 1)