查找素数的Eratosthenes(筛子)算法终止条件解释
来源:互联网 发布:win8能装ubuntu 编辑:程序博客网 时间:2024/04/27 16:36
看书看到了Eratosthenes算法查找1~n中的素数,这也是招聘中常考的题目,其中的循环终止条件为n的开根号,想了很久没想懂,查了资料然后用实例慢慢跟感觉懂了一点,如果写得不对请指正。
算法思路:
从2开始(1既不是素数,也不是合数),建一个变量标记是否为素数,可以是boolean的数组或者Bitset;
将当前素数的倍数所对应的位置标记为非素数即可
循环的终止条件为n的开根号,因为n的开根号存在精确度问题,所以转换为i*i<=n,原因:
假设最接近n的开根号的整数为j
1.如果i小于j,这是需要进行循环判断的;
2.如果i大于j,则(n/i)小于j。这句话的意思可以解读为:
2.1.如果此时遍历的i是素数,则不判断也没关系
2.2.如果此时遍历的i不是素数,则它一定是前面j之前的某一个数的倍数
举例,查找1~100的素数,则循环到10即可,因为大于10的数:
1.如果这个数是素数,如11,则可以不遍历;
2.如果这个数不是素数,如20,100/20=5<10,所以20肯定是10以内某个数的倍数,我们在之前的循环操作中已经将其标记为非素数了,以此类推。又比如15,100/15=6<10等等。
附《java核心技术》中的代码
import java.util.*;public class Sieve { public static void main(String[] args) { int n = 2000000; long start = System.currentTimeMillis(); BitSet b = new BitSet(n+1); int count = 0; for(i = 2; i <= n; i++) { b.set(i); } i = 2; while(i * i <= n) { if(b.get(i)) { count++; int k = 2 * i; while(k <= n) { b.clear(k); k += i; } } i++; } while(i <= n) { if(b.get(i)) count++; i++; } long end = System.currentTimeMillis(); System.out.println(count + "primes"); System.out.println((end - start) + "milliseconds"); }}
使用boolean作为标记的可以参考http://www.cnblogs.com/luzheng1/archive/2013/04/09/3009344.html
参考资料http://www.cnblogs.com/luluping/archive/2010/03/03/1677552.html
阅读全文
0 0
- 查找素数的Eratosthenes(筛子)算法终止条件解释
- 用Eratosthenes筛子算法,求解从2到n之间的素数
- Eratosthenes筛选法求素数的算法
- Eratosthenes筛选法求素数的算法
- 找素数的Eratosthenes算法(筛选法)
- 素数表(Eratosthenes)
- Eratosthenes筛计算N以内的素数
- Python和C++求10000以内的所有素数(Eratosthenes筛选 求素数)
- Sieve Of Eratosthenes求素数(埃拉托斯特尼筛法)
- Eratosthenes 法找素数 (含代码)
- Eratosthenes筛法(素数筛法)
- 数论之素数,包括eratosthenes算法,欧拉函数
- 【C++】埃拉托色尼筛子表示一定范围内的素数
- 著名的Eratosthenes求素数方法(程序员的数学思维修炼)
- 著名的Eratosthenes求素数方法(程序员的数学思维修炼)
- Eratosthenes筛法求1——100000之间所有的素数(32位汇编语言)
- 10375 - Choose and divide(唯一分解定理的运用 eratosthenes构造素数表)
- Eratosthenes筛法求素数
- Android数据存储之SQLite
- c3p0参数解释
- python3.6中xadmin安装问题
- Leetcode [Merge Two Sorted Lists]
- Proxmox + Ubuntu16.04 + CUDA 8.0 环境下,安装Tensorflow
- 查找素数的Eratosthenes(筛子)算法终止条件解释
- Springmvc前端JSON转换器MappingJackson2HttpMessageConverter设置对值为null的处理
- Framework学习(十)Content Provider启动过程
- Linux之运算符与表达式
- 15 半连接(semi-join)--优化主题系列
- 《数据结构》实验二: 线性表综合实验——总结线性表的几种主要存储结果
- Azure 经典模式中虚拟机证书指纹的生成和作用
- SpringBoot整合Swagger2
- C++ primer6.21练习题(产生随机数的相关知识)