第四章:如何高效寻找素数

labuladong如何高效寻找素数

204. 计数质数

统计所有小于非负整数 n 的质数的数量

  • 初始化时,给每个位置立一个flag,并初始化为1
  • 遍历时,对于i而言:
    • 如果这个位置的flag为1,说明数字 i 没有被比 i 小的数整除过,说明它是质数,计数器+1。
    • i 的倍数一定不是质数,将这些数的flag设置为0

一切尽在sieve of Eratosthenes算法的图

class Solution:
    def countPrimes(self, n) :
        #给每个位置立一个flag,初始化为1
        isPrimes = [1] * n
        #result,输出的质数总个数的计数器,初始化为0
        res = 0
        #循环,从最小质数i开始到n循环
        for i in range(2, n):
            #如果这个位置的flag为1,说明数字 i  没有被比 i 小的数整除过,说明它是质数,计数器+1
            if isPrimes[i] == 1: res += 1

            #下面这几步的思路是, i 的倍数一定不是质数,将这些数的flag设置为0
            #设置倍数 j ,初始化与 i 相等。 因为i也是一点点加上来的,比如 i=5的时候,i 的4倍一定在 i=4 时已经设置为0过。
            j = i
            # 因为统计的是所有小于非负整数 n 的质数的数量,当 i 的 j 倍 >=n 时,跳出循环
            while i * j < n:
                #设置i 的 j 倍的flag为0
                isPrimes[i * j] = 0
                # 自增,下一个找 j+1 倍
                j += 1
        #返回结果
        return res

   转载规则


《第四章:如何高效寻找素数》 M 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
第四章:如何运用二分查找算法 第四章:如何运用二分查找算法
labuladong 如何运用二分查找算法 875. 爱吃香蕉的珂珂 canFinish() 函数:当前速度下,能吃完的小时数(注意要向上整除) 最小速度为1,最大速度为数组中最大值。因此利用二分查找框架求h(h相当于二分查找中的目
2020-08-17
下一篇 
第三章:递归详解 第三章:递归详解
labuladong 递归详解 437. 路径总和 III方法1:递归 递归时,想清楚: 这个函数是干什么的?不要跳进递归,没用。 这个函数参数中的变量是什么?(函数的参数中可以传递这个变量) 得到函数的递归结果,你应该干什么 (比如前序
2020-08-17
  目录