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

C++ 中的 **普通筛、埃氏筛、线性筛**,它们都是求质数或判断质数的方法

普通筛、埃氏筛、线性筛,它们都是求质数或判断质数的方法,但原理和复杂度不同。

1️⃣ 普通筛(暴力判断质数)

思路:

  • 对每个数 i(2 ≤ i ≤ n),判断它是否能被小于它的数整除。
  • 如果不能整除,则 i 是质数。

复杂度:

  • 最坏情况下 O(n√n),当 n 较大时效率低。

C++ 示例:

#include <bits/stdc++.h>
using namespace std;bool isPrime(int x) {if (x < 2) return false;for (int i = 2; i * i <= x; ++i)if (x % i == 0) return false;return true;
}int main() {int n;cin >> n;for (int i = 2; i <= n; ++i) {if (isPrime(i)) cout << i << " ";}return 0;
}

2️⃣ 埃氏筛(Sieve of Eratosthenes)

思路:

  1. 建立长度为 n 的布尔数组 is_prime,初始都为 true。
  2. 从 2 开始,若 i 是质数,则把 i 的所有倍数标记为非质数。
  3. 最终 is_prime[i] 为 true 的就是质数。

复杂度:

  • O(n log log n)
  • 对 n ≤ 10⁷ 或 10⁸ 都够用。

C++ 示例:

#include <bits/stdc++.h>
using namespace std;int main() {int n;cin >> n;vector<bool> is_prime(n+1, true);is_prime[0] = is_prime[1] = false;for (int i = 2; i*i <= n; ++i) {if (is_prime[i]) {for (int j = i*i; j <= n; j += i)is_prime[j] = false;}}for (int i = 2; i <= n; ++i) {if (is_prime[i]) cout << i << " ";}return 0;
}

3️⃣ 线性筛(Linear Sieve / 欧拉筛)

特点:

  • 保证每个合数只被它最小的质因子标记一次。
  • 可以顺序生成质数数组 primes
  • 复杂度 O(n)(比埃氏筛更快)。

思路:

  1. 遍历每个数 i(2 ≤ i ≤ n)

  2. 如果 i 是质数,加入 primes 数组

  3. 遍历 primes 数组:

    • 计算 i * primes[j] ≤ n
    • 标记 i * primes[j] 为非质数
    • 如果 i % primes[j] == 0,则 break(保证每个数只被它最小的质因子标记一次)

C++ 示例:

#include <bits/stdc++.h>
using namespace std;int main() {int n;cin >> n;vector<int> primes;vector<bool> is_prime(n+1, true);for (int i = 2; i <= n; ++i) {if (is_prime[i]) primes.push_back(i);for (int p : primes) {if (i * p > n) break;is_prime[i*p] = false;if (i % p == 0) break;}}for (int p : primes) cout << p << " ";return 0;
}

特点对比:

筛法 时间复杂度 优点 缺点
普通筛 O(n√n) 代码简单 n 大时慢
埃氏筛 O(n log log n) 高效,易实现 不能直接获取最小质因子
线性筛 O(n) 高效,可求最小质因子 实现稍复杂

http://www.jsqmd.com/news/42017/

相关文章:

  • Linux - sudo -i
  • 利用单片机的TIM模块播放春日影
  • warp-cli代理
  • 完整教程:Rust语言特性深度解析:所有权、生命周期与模式匹配之我见
  • 20231427田泽航第九周预习报告
  • do文件仿真 fpga
  • 20232412 2024-2025-1 《网络与系统攻防技术》实验五实验报告
  • 本地缓存Caffeien
  • 实用指南:C++---嵌套类型(Nested Types)封装与泛型的基石
  • [ sqlite ]
  • 视野修炼-技术周刊第127期 | Valdi
  • 完整教程:机器学习:基于大数据的基金数据分析可视化系统 股票数据 金融数据 股价 Django框架 大数据技术(源码) ✅
  • 科学计算复习
  • 【AIGC】语音识别ASR:火山引擎大模型技术实践 - 详解
  • 2025年11月石笼网厂家最新推荐,聚焦资质、案例、售后的五家企业深度解读!
  • 2025 年 11 月石笼网厂家最新推荐,技术实力与市场口碑深度解析!
  • 2025年11月温州律师事务所最新推荐,实力机构深度解析与择选指南!
  • python: 用pyppeteer以无头方式抓取页面
  • python共享内存的读写同步与加锁 —— multiprocessing.Value和multiprocessing.Array、加锁
  • 2025年11月温州律师事务所最新推荐,聚焦资质、案例、服务的五家机构深度解读!
  • UI设计公司审美积累|办公类软件界面设计巧思,效率与视觉的双重升级
  • 详细介绍:AVL树手撕,超详细图文详解
  • 网络安全
  • Zhengrui 11.16 总结
  • 实用指南:spark组件-spark core(批处理)
  • windows安装mingw
  • C# 高级类型 dynamic,list,泛型(学习笔记5)
  • filebeat + logstash接入OpenStack日志
  • 构建AI智能体:六十九、Bootstrap采样在大模型评估中的应用:从置信区间到模型稳定性 - 指南
  • pip安装或查看工具包时显示WARNING: Ignoring invalid distribution -XX的解决办法