跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

C++ 素数筛法:埃氏筛与线性筛原理及实现

综述由AI生成C++ 中两种常用的素数筛选算法:埃氏筛法和线性筛法。埃氏筛通过删除素数的倍数来筛选,时间复杂度为 O(n log log n),适合中小数据范围。线性筛利用最小质因数确保每个合数只被标记一次,时间复杂度为 O(n),效率更高,适用于大数据场景。文章提供了两种算法的核心思想、代码模板及适用场景对比。

狂少发布于 2026/3/21更新于 2026/5/2421 浏览
C++ 素数筛法:埃氏筛与线性筛原理及实现

C++ 素数筛法:埃氏筛与线性筛原理及实现

概述

在数字王国里,寻找素数是一项基础任务。对于大范围数据,逐个判断效率低下。本文介绍两种高效筛选算法:埃氏筛(Eratosthenes Sieve)和线性筛(Euler Sieve)。

一、埃氏筛法

1. 核心思想

每发现一个素数,就把它的倍数全部划掉。这样剩下的就都是素数。

2. 步骤示例

以 1~30 为例:

  1. 初始化所有数为素数。
  2. 从 2 开始,将 2 的倍数划掉。
  3. 找到下一个未被划掉的数(3),将其倍数划掉。
  4. 重复直到处理完 √n。

3. 优化说明

  • 只需筛到 √n:若 n 是合数,必有因子 ≤ √n。
  • 从 i*i 开始:小于 i*i 的倍数已被更小的质因数筛过。

4. 时间复杂度

O(n log log n)

5. 代码模板

#include <iostream>
using namespace std;
const int N = 1000000;
bool isPrime[N];

int main() {
    int n;
    cin >> n;
    for(int i=2; i<=n; i++) isPrime[i] = true;
    for(int i=2; i*i<=n; i++) {
        if(isPrime[i]) {
            for(int j=i*i; j<=n; j+=i) isPrime[j] = false;
        }
    }
    for(int i=2; i<=n; i++) {
        if(isPrime[i]) cout << i << " ";
    }
    return 0;
}

二、线性筛法

1. 核心思想

每个合数 = 最小质因数 × 另一个数。只用最小质因数来筛掉它,保证每个合数只被删一次。

2. 关键逻辑

  • 维护素数表 prime[]。
  • 遍历 i,若 i 是素数则加入表。
  • 用 i 乘以素数表中的数生成合数。
  • 若 i % prime[j] == 0,则停止(保证 prime[j] 是 i 的最小质因数)。

3. 时间复杂度

O(n),真正的线性时间。

4. 代码模板

#include <iostream>
using namespace std;
const int N = 1000000;
int prime[N];
bool vis[N];

int main() {
    int n;
    cin >> n;
    int cnt = 0;
    for(int i=2; i<=n; i++) {
        if(!vis[i]) prime[cnt++] = i;
        for(int j=0; j<cnt && i*prime[j]<=n; j++) {
            vis[i*prime[j]] = true;
            if(i % prime[j] == 0) break;
        }
    }
    for(int i=0; i<cnt; i++) cout << prime[i] << " ";
    return 0;
}

三、对比与选择

方法原理复杂度
埃氏筛删除倍数O(n log log n)
线性筛最小质因数O(n)
  • 小数据 (n ≤ 10^6):推荐埃氏筛,简单好写。
  • 大数据 (n ≥ 10^7):推荐线性筛,速度更快。

总结

  • 埃氏筛:发现素数 → 删除倍数。
  • 线性筛:每个合数只筛一次。

目录

  1. C++ 素数筛法:埃氏筛与线性筛原理及实现
  2. 概述
  3. 一、埃氏筛法
  4. 1. 核心思想
  5. 2. 步骤示例
  6. 3. 优化说明
  7. 4. 时间复杂度
  8. 5. 代码模板
  9. 二、线性筛法
  10. 1. 核心思想
  11. 2. 关键逻辑
  12. 3. 时间复杂度
  13. 4. 代码模板
  14. 三、对比与选择
  15. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 十个实用的 Python 自动化脚本
  • C++ 语言基础与进阶学习教程
  • C++11 核心新特性解析:列表初始化、右值引用与移动语义
  • 国产开源时序数据库 IoTDB 选型指南与核心功能解析
  • AI 大模型基础认知:从入门原理到行业赋能
  • Cobalt Strike 魔改二开:Checksum8 算法、Beacon 密钥与 Stager 流量生成机制
  • 前端可视化打印设计器 Vue Print Designer 介绍
  • 基于FPGA的简易数据采集系统
  • 基于 Spring Boot 与 Leaflet 的省级旅游口号 WebGIS 可视化实现
  • 网络安全护网行动与红蓝对抗机制详解
  • Typora 编辑器安装与使用指南
  • STL-thumbnail:Windows 资源管理器 STL 文件预览方案
  • STL 容器适配器 Stack、Queue 与 Priority Queue 的模拟实现
  • 无线联邦学习:保护隐私的无线网络 AI 协同进化
  • YOLOv3 C++ DLL 调用与 CUDA 依赖配置
  • XRoboToolkit 基于 PICO 4 Ultra 的机器人遥操作方案
  • Copilot Pro 使用指南:模型配额与选型策略
  • MaaFramework 实战:5 步创建自定义识别与操作模块
  • C++ 复习核心知识点
  • Leaflet+SpringBoot 实现地图任意点位点击查看时间功能

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online