当前位置: 首页 > article >正文

找质数的方式

在很多编程题中,可能需要找出小于N的质数,一般的枚举算法是比较费时的(比如遍历小于$\sqrt{n}$的所有数,判读其是否是n的因子),这里介绍一种更为高效的算法:埃氏筛

步骤如下:

  • 使用长度为 n 的数组 is_prime 来判断一个数是否是质数。如果 is_prime[i] == True ,则表示 i 是质数,如果 is_prime[i] == False,则表示 i 不是质数。并使用变量 count 标记质数个数。
  • 然后从 [2,n−1] 的第一个质数(即数字 2) 开始,令 count 加 1,并将该质数在 [2,n−1] 范围内所有倍数(即 4、6、8、...)都标记为非质数。
  • 然后根据数组 is_prime 中的信息,找到下一个没有标记为非质数的质数
  • 以此类推,直到所有小于或等于 n−1 的质数和质数的倍数都标记完毕时,输出 count
  • 优化:对于一个质数 y,我们可以直接从 y×y 开始标记,这是因为 2×y、3×y、… 这些数已经在 y 之前就被其他数的倍数标记过了,例如 2 的所有倍数、3 的所有倍数等等。
    class Solution:
        def countPrimes(self, n: int) -> int:
            is_prime = [True] * n
            count = 0
            for i in range(2, n):
                if is_prime[i]:
                    count += 1
                    for j in range(i * i, n, i):
                        is_prime[j] = False
            return count
    


http://www.kler.cn/a/321826.html

相关文章:

  • Qt 日志文件的滚动写入
  • 游戏引擎学习第10天
  • Serverless架构在实时数据处理中的应用
  • FFmpeg 4.3 音视频-多路H265监控录放C++开发十三.2:avpacket中包含多个 NALU如何解析头部分析
  • 基于node一键发布到服务器的js脚本
  • 前端vue 列表中回显并下拉选择修改标签
  • MATLAB中的无线通信系统测试和验证方法有哪些
  • 代码随想录Day17 图论-1
  • 调和级数枚举+前缀和,CF 731F - Video Cards
  • flutter 设置字体大小,适应各种屏幕
  • 【LeetCode:2535. 数组元素和与数字和的绝对差 + 模拟】
  • 16.面试算法-树的层次遍历与相关面试题
  • ConfigurationManager类功能如何使用
  • 网络原理 - TCP/IP
  • SkyWalking 环境搭建部署
  • 【JAVA开源】基于Vue和SpringBoot的网上租赁系统
  • 获取鼠标当前位置上的元素
  • mysql配置相关命令
  • Mysql的隔离级别
  • SQL 查询语句的顺序详解
  • vue3 + ts + pnpm:nprogress / 页面顶部进度条
  • [数据库] Redis学习笔记(二):Redis Java客户端(Jedis/SpringDataRedis)
  • Uniapp 微信小程序 最新 获取用户头像 和 昵称 方法 有效可用
  • Git 常用操作命令说明
  • 基于python深度学习遥感影像地物分类与目标识别、分割实践技术
  • 343.整数拆分