class Solution(object):
def countPrimes(self, n):
if n <= 2:
return 0
output = [1] * n # 首先生成一个全部为1的列表
output[0], output[1] = 0, 0
for i in range(2, int(n**0.5)+1):
if output[i] == 1: # 如果i为质数
output[i*2:n:i] = [0] * len(output[i*2:n:i]) # 将i的倍数置为0
print(i, output) # i*i到n之间隔i取一次数
return sum(output)
方案2:厄拉多塞筛法
西元前250年,希腊数学家厄拉多塞(Eeatosthese)想到了一个非常美妙的质数筛法,质数的因子除了1就是它本身,因此从2开始的任意一个数x,x乘一个大于1的正整数得到的数字一定不是质数,根据这个原理,我们可以进行如下操作:
要寻找到正整数n为止的质数个数,构造一个长度为n的向量output,output[i]表示正整数i是否是质数,初始化这个向量中所有的元素为1(True)。
output前两个数置零(1和2不是质数),遍历从2开始到suqare(n)+1范围内的所有正整数i,将output向量中所有是i的正整数倍(大于1)的数所在位置全部置零。
循环结束后得到的output向量即可代表相应位置的每一个正整数是否为质数,求和即为结果。
关于for i in range(2, int(n**0.5)+1):
无论它多大或者多小,总是数相乘,一大一小的数,比如:100,根号100是10;你看,zhi所有 能被100除的数都在10以内,就算他的最大除数50大于10;可是别忘了,502=100,也就是说,除到他的根号以内,如果都没有,那么外面的数就绝对不可能,1111,是100的根号外最小的数,他也比100大
https://blog.csdn.net/github_39261590/article/details/73864039