算法入门|埃拉托斯特尼筛法,一张表筛出 1~120 所有质数
简介课堂上用表格直观演示埃拉托斯特尼筛法一次性筛选 1~120 全部素数。本文结合 PPT 表格图解拆解筛法原理、完整执行步骤、优缺点附上可直接运行的 Java 代码适合算法入门、课堂作业复习。一、课堂演示图说明屏幕表格范围数字 2 ~ 120表格通过标红 / 涂色标记非素数合数未被涂色的灰色数字就是质数Prime numbers。核心规则从最小素数 2 开始不断标记当前素数的所有倍数全部标记完成后剩下未标记数字就是 1~120 范围内全部素数。二、什么是埃拉托斯特尼筛法埃氏筛基础概念质数素数大于 1只能被 1 和自身整除的整数。埃氏筛Sieve of Eratosthenes是高效批量查找区间内所有素数的经典算法不用逐个数字试除通过倍数批量排除合数大幅降低时间复杂度。核心思想数字 2 是最小、唯一的偶素数把 2 的所有倍数全部标记为合数4、6、8、10…120找到下一个未标记数字 3标记 3 所有倍数6、9、12…120继续取下一个未标记数字 5标记 5 所有倍数循环到数字√上限本案例上限 120只需循环到 11剩余未标记数字全部是素数。三、结合课堂表格分步还原筛选 1~120 全过程步骤 1初始化列出 2~120 全部数字默认全部判定为素数表格浅灰色底色。数字 1 直接丢弃1 既不是素数也不是合数。步骤 2处理素数 22 是素数将表格里所有 2 的倍数标红4,6,8,10,12…120 全部标记为合数。表格中所有偶数列数字被涂色偶数除 2 外都不是素数。步骤 3处理下一个未标记数字 33 是素数标记 3 全部倍数6,9,12,15,18…1206、12 等已经被 2 标记重复标记不影响结果。步骤 4下一个未标记数字 5标记 5 倍数10、15、20…120表格末尾整十数字全部变红。步骤 5持续循环到√120≈11依次处理 7、117 的倍数14、21、28…11911 的倍数22、33、44…121超出 120 截止步骤 6筛选结束所有被涂色标红的是合数表格中保持浅灰色、无填充的数字就是 2~120 全部素数。图右侧标注Prime numbers 2代表 2 是第一个基础素数。四、埃氏筛优缺点分析优点批量筛选时间复杂度 O (n log log n)远优于逐个试除暴力解法逻辑直观表格可视化后极易理解课堂教学首选只需一次遍历就能得到区间全部素数适合打素数表、预处理。缺点需要开辟长度为 n 的布尔数组存储标记有额外空间开销筛选超大数字区间时内存占用会快速上升会重复标记同一个合数如 6 同时是 2 和 3 倍数存在少量重复操作。五、Java 完整代码实现筛出 1~120 素数对应课堂案例publicclassEratosthenesSieve{publicstaticvoidmain(String[]args){// 上限和课堂表格一致120intmax120;// 布尔数组标记是否为素数默认true代表初始判定为素数boolean[]isPrimenewboolean[max1];// 初始化2~120全部设为素数for(inti2;imax;i){isPrime[i]true;}// 埃氏筛核心循环循环到平方根即可intsqrtMax(int)Math.sqrt(max);for(inti2;isqrtMax;i){// 如果当前数字是素数批量标记它的所有倍数if(isPrime[i]){// 从i*i开始标记更小倍数已经被更小素数标记过for(intji*i;jmax;ji){isPrime[j]false;}}}// 输出1~120所有素数和课堂表格结果对照System.out.println(1~120之间所有素数);for(inti2;imax;i){if(isPrime[i]){System.out.print(i );}}}}六、学习总结课堂上的数字表格把抽象的埃氏筛算法直观可视化让我看懂批量排除合数的核心逻辑。对比暴力逐个试除判断素数埃氏筛通过倍数批量标记极大提升了运算效率适合一次性获取区间全部素数。同时我也理解了算法取舍埃氏筛以少量内存空间换取更低时间复杂度不同业务场景要根据数据规模选择合适素数查找方案。本次演示案例上限 120 规模小表格形式清晰易懂是入门数论算法很好的练习案例。