当前课程知识点:程序设计基础 > 第四章 筛法与查找 > 4.2 筛法 > 4.2.1 筛法思路
前一段当中我们用枚举法
写了一个自定义的函数来
完成找素数这样一个问题
那我在运行的过程当中也给大家演示了
当问题的规模逐渐的增大的时候
这样一个方法
实际上求素数的效率其实并不高
那有同学说了
其实这个问题我以前就做过
当时就告诉我说
有这样一个比较快的方法叫筛法
其实这个筛法据说是古希腊时代的
名字叫艾拉托斯特尼这样一个人发明的
大约在公元前274年到194年
活得挺久的一位老科学家
所以一般我们又把筛法称为
艾拉托斯特尼筛法
下面我们就来看看
筛法的思路是什么样子的
这个过程可能大家以前在高中或者初中
有可能接触过
首先就会做好一个筛子
然后筛子里每一个格子会给它一个编号
从2一直编到100
然后开始用2筛
什么叫用2筛
就是把2之后所有2的倍数筛掉
用2把后面的4,6,8筛掉
然后再用3把后面的3的倍数筛掉
6 9 我们发现6已经被筛掉了
重复筛也行 不重复筛也可以
然后再往下发现4已经被筛掉了
就不用再用4的倍数进行筛了
以此类推的
我们后面再用5筛一次
用7筛一次
100以内的素数 剩下来的就是了
那整理一下我们刚才这样一个思路
是不是其实和小朋友插花
一遍一遍去插的过程是差不多的
稍微做了点改进
一个改进可能是我们发现
有一个数已经被筛掉了
就不用让这个小朋友再去插一遍花了
这个方法写成程序会是什么样子的呢
我们下面来试试看
首先咱们还是把这个思路先写下来
首先要初始化一个筛子
然后枚举一下
枚举的过程实际上是从2一直到根号100
当中的每一个数
然后来判断这个D是不是被筛掉了
如果没有筛掉
再用D去筛100以内的所有素数
等到所有的D枚举结束了之后
最后输出所有的没有被筛掉的数
就是所有的素数了
那这个思路里面最关键的有几个点
一个是这个筛子是什么
我们看到筛子其实是表达的是
一个数是不是被筛掉了
这样的数一共有2到100
也就是99个数
我们就需要有99个变量
那根据我们前面的知识要写99个变量
那就写去吧 ABCDEF
发现这个字母都不够用了
怎么办啊
我们的变量名可以起得带数字的
可以起成 直接是数字是不行的
直接起成123是不行的
但是我们可以起成A1 A2 A3
编号从2开始就是A2 A3 A4一直到A100
写99个变量大家可以自己去试一下
需要很长时间
这个一般也写得比较累
另外一个问题
就算我们把这个99个变量定义出来了
怎么通过D去找到对应的变量
或者说怎么去通过D找到
这个数有没有被筛掉呢
这个名字只是一个变量的名字
我们没有办法
现在没有办法通过D去找到它
这个时候我们需要引入一个新的概念
我们叫数组
-1.1 基础知识
-1.2 买菜问题
-1.3 数学运算
-1.4 补充说明
-1.5 总结
--1.5 总结
-程设论道
--程设论道
-师生问答
-第一章 编程初步--语法自测
-2.1 关于超级计算器的几点思考
-2.2 电子秤模拟 — 背景介绍及需求分析
-2.3 电子秤模拟 — 代码实现
-2.4 变量定义与变量类型
-2.5 猜数游戏与数据表示
-2.6 关于变量的讨论
--公告
-2.7 变量体现的计算思维
-程设论道
--程设论道
-师生问答
--师生问答
-第二章 变量与代数思维--语法自测
-3.1 谁做的好事——语义表示
-3.2 谁做的好事——真假检查
-3.3 谁做的好事——循环枚举
-3.4 谁是嫌疑犯——多重循环枚举
-3.5 谁是嫌疑犯——破案线索表示
-3.6 谁是嫌疑犯——用二进制枚举
-程设论道
--程设论道一
--程设论道二
--程设论道三
-师生问答
-第三章 逻辑推理与枚举解题--语法自测
-4.1 插花游戏
-4.2 筛法
-4.3 线性查找
-4.4 折半查找
--4.4.1 提问
-4.5 排序问题
-4.6 总结
--4.6.1 总结
-程设论道
--程设论道二:筛法
-师生问答
-第四章 筛法与查找--语法自测
-5.1 阶乘
-5.2 排序
-5.3 矩阵填充
-5.4 分书与八皇后
-5.5 青蛙过河
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答一
--师生问答二
-第五章 分治思想与递归--语法自测
-6.1 兔子数列问题
-6.2 分鱼问题
-6.3 橱窗的插花问题
-6.4 最长公共子序列问题
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答
-第六章 递推与动态规划--语法自测
-7.1 统计记录总数
-7.2 统计活跃用户数
-7.3 统计在线时长
--7.3.2 结构
-7.4 总结
--7.4.1 总结
-程设论道
--程设论道
-师生问答
--师生问答
-第七章 文本数据处理--语法自测
-8.1 将数据组织成链表
-8.2 提高链表访问效率 —— 哈希链表
-8.3 以二进制文件存储链表
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答
-第八章 非文本数据处理--语法自测
-9.1 自动售卖程序
-9.2 配制水果信息
-9.3 指定界面语言
-程设论道
--程设论道
-师生问答
--师生问答
-第九章 可配置的程序设计--语法自测