#返回类型:列表
#说明:返回小于upperBound的所有素数
def ouLaShai(upperBound):
filter=[False for i in range(upperBound+1)]
primeNumbers=[]
for num in range(2,upperBound+1):
if not filter[num]:
primeNumbers.append(num)
for prime in primeNumbers:
if num*prime>upperBound:
break
filter[num*prime]=True
if num%prime==0: #这句是最有意思的地方 下面解释
break;
return primeNumbers
def test():
correctResult_30=[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
ouLaShaiResult_30=ouLaShai(30)
if(ouLaShaiResult_30==correctResult_30):
print('correct')
else:
print('wrong')
if __name__=='__main__':
test()
if num%prime==0 这句我苦思冥想许久,在此将想法分享给大家。
假设没有这句话,程序依然能得到正确的结果,只不过是有很多无用的筛选。
例如24 什么时候会筛它呢 2*12 3*8 4*6 6*4 8*3 12*2
其实我们只用在2*12时将其筛去即可
也就是说a*b==c仅当a是c最小的素数因子时筛去c
if num%prime==0 然后break掉 就是为了保证上述条件
若num%prime==0 则存在q∈整数 使得num==prime*q (prime<=q )
next(prime)*num == next(prime)*prime*q == prime*next(prime)*q ( prime<next(prime) and prime<q ) //next(prime)代表素数数组中prime后面的元素
而数 prime*next(prime)*q 应由 num==next(prime)*q 时筛去
所以此时的num已经筛数完成( 已经是萎了 筛不动了) 应执行num+1的筛数