除了自身之外,无法被其它整数整除的数称之为质数,要求质数很简单,但如何快速的求出质数则一直是程式设计人员与数学家努力的课题,在这边介绍一个着名的 Eratosthenes求质数方法。

解法首先知道这个问题可以使用回圈来求解,将一个指定的数除以所有小于它的数,若可以整除就不是质数,然而如何减少回圈的检查次数?如何求出小于N的所有质数?

首先假设要检查的数是N好了,则事实上只要检查至N的开根号就可以了,道理很简单,假设A*B = N,如果A大于N的开根号,则事实上在小于A之前的检查就可以先检查到B这个数可以整除N。不过在程式中使用开根号会精确度的问题,所以可以使用 i*i <= N进行检查,且执行更快。

再来假设有一个筛子存放1~N,例如:

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ........ N

先将2的倍数筛去:

2 3 5 7 9 11 13 15 17 19 21 ........ N

再将3的倍数筛去:

2 3 5 7 11 13 17 19 ........ N

再来将5的倍数筛去,再来将7的质数筛去,再来将11的倍数筛去........,如此进行到最后留下的数就都是质数,这就是Eratosthenes筛选方法(Eratosthenes Sieve Method)。

检查的次数还可以再减少,事实上,只要检查6n+1与6n+5就可以了,也就是直接跳过2与3的倍数,使得程式中的if的检查动作可以减少。

实作

#include <stdio.h>
#include <stdlib.h> #define N 1000 int main(void) { int i, j; int prime[N+1]; for(i = 2; i <= N; i++) prime[i] = 1; for(i = 2; i*i <= N; i++) { // 这边可以改进 if(prime[i] == 1) { for(j = 2*i; j <= N; j++) { if(j % i == 0) prime[j] = 0; } } } for(i = 2; i < N; i++) { if(prime[i] == 1) { printf("%4d ", i); if(i % 16 == 0) printf("\n"); } } printf("\n"); return 0;
} 

Eratosthenes筛选求质数相关推荐

  1. c语言筛选法_极少数人用过的另类素数求解法,C语言经典算法之筛选法求质数...

    筛选求质数 明除了自身之外,无法被其它整数整除的数称之为质数,要求质数很简单,但如何快速的求出质数则一直是程式设计人员与数学家努力的课题,在这边介绍一个着名的 Eratosthenes求质数方法. 行 ...

  2. c语言筛选法_「干货」C语言经典算法筛选法求质数,极少数人用过的素数求解法...

    小编是一个有着6年工作经验的工程师,关于C++编程,自己有做材料的整合,一个完整的C++编程学习路线,学习资料和工具,能够进我的群10048,-83029收取,免费送给大家,希望你也能凭着自己的努力, ...

  3. 质数c语言欧拉筛选,Python|欧拉筛法求质数

    欢迎点击「算法与编程之美」↑关注我们! 本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章. 问题描述 我们知道第一个质数是 2.第二个质数是 3.第三个质 ...

  4. 经典算法-并查集、快速排序、字典序算法、二分搜索、牛顿开方法、求质数(筛选法)、编辑距离、滑动窗口、异或求重、长除法

    目录 ​​​​​​​​​​​​​​ 并查集 快速排序 字典序算法 二分搜索 开根号-牛顿开方法 求质数 编辑距离 滑动窗口 异或求重 长除法 ​​​​​​​ 并查集 并查集用于解决相同元素集合动态连接 ...

  5. 筛选法求质数(Java实现)

    筛选法求质数:输入一个整数 n,求小于这个整数的所有质数. 算法:定义一个长度为 n 的 boolean 数组,true 表示是质数,false 表示不是质数.初始均为 true. 之后从 2 开始循 ...

  6. Eratosthenes筛选法

    比起C++版,有点太费空间,弃用.参见:Eratosthenes筛选法(C++版). Sieve of Eratosthenes 使用埃拉托斯特尼筛选法计算小于100000的素数. 埃拉托斯特尼筛选法 ...

  7. 【算法专题】筛法求质数

    筛法求质数 1. 概述 判断一个数n是否是质数,可以使用试除法,时间复杂度是O(n)O(\sqrt n)O(n​)的. 现在的问题是求1~n中的所有质数,如果一个一个判断的话,时间复杂度是O(n×n) ...

  8. 求质数算法的N种境界

    求质数算法的N种境界 (N > 10) 分类: 性能优化2011-12-01 22:21 13710人阅读 评论(40) 收藏 举报 算法存储语言工作byte优化 目录(?)[+] ★引子 前天 ...

  9. python求素数代码_Python编程求质数实例代码

    本文研究的主要是Python编程求质数实例,选取了几个数进行了测试,具体如下. 定义:质数又称素数.一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数:否则称为合数. 我们知道自然 ...

最新文章

  1. [YTU]_2354 (H 实现复数类中的加运算符重载【C++运算符重载】)
  2. Fragment 退出动画导致fragment退出失败问题(罕见问题)
  3. yum安装源是出现报冲突错误,解决办法
  4. C#中的线程(一)入门
  5. 移动数据文件、控制文件、日志文件
  6. python库路径_如何设置本地python库目录/ PYTHONPATH?
  7. dbForge Studio for SQL Server入门教程:如何创建和编辑查询
  8. 根据ip和子网掩码技术可用网段的在线工具
  9. 西门子三开接线图解_西门子三位单控开关怎么接线要开关实际图
  10. 如何下载react依赖包
  11. Java常用基础知识点总结(最全)
  12. Git:不同仓库之间的cherry-pick
  13. 安装AUTOROM、导入ROMs
  14. C/C++语言100题练习计划 97——素数对
  15. javascript通过组合实现继承
  16. HTML5 参考手册 ———— 颜色名
  17. windows账户被停用,如何启动账户?
  18. linux搭建云存储,搭建nextcloud私有云存储网盘
  19. DirectX游戏开发之代码的框架简析
  20. 使用docker搭建gitlab版本控制系统

热门文章

  1. Axure 部件的交互样式
  2. Stack Overflow:研究发现访问PHP和 Android的流量更可能来自低收入国家
  3. 谈谈常用清除浮动的方法
  4. 如何使用HTML5,CSS3和PHP创建一个联系表格
  5. “当前上下文中不存在名称”解决
  6. 关于OPENGL的各个变换的顺序
  7. CSS3动画属性之Transition
  8. Git学习系列之Git和TortoiseGit的区别
  9. 机房空调制冷机柜起到了什么作用?
  10. php遍历指定目录中的内容2