Sieve of Eratosthenes(埃拉托斯特尼素数筛选法)--java实现
2016-07-11 14:58
603 查看
埃拉托色尼筛选法
埃拉托色尼选筛法(the Sieve of Eratosthenes)简称埃氏筛法,是古希腊数学家埃拉托色尼(Eratosthenes 274B.C.~194B.C.)提出的一种筛选法。 是针对自然数列中的自然数而实施的,用于求一定范围内的质数。步骤
(1)先把1删除(现今数学界1既不是质数也不是合数)(2)读取队列中当前最小的数2,然后把2的倍数删去
(3)读取队列中当前最小的数3,然后把3的倍数删去
(4)读取队列中当前最小的数5,然后把5的倍数删去
(5)如上所述直到需求的范围内所有的数均删除或读取
示例
Apply sieve of Eratosthenes to find all primes in range 2..100.Initial grid
2 is prime, mark all multiples of 2, starting from 4
3 is prime, mark all multiples of 3, starting from 9
5 is prime, mark all multiples of 5, starting from 25
7 is prime, mark all multiples of 7, starting from 49
112 is more, than 100, all unmarked numbers are primes
Final result
代码
public class Prime_Sieve { private boolean[] sieveOfEratothenes(int max) { boolean[] flags = new boolean[max + 1]; // int count = 0; for (int i = 2; i < flags.length; i++) { flags[i] = true; } int prime = 2; while (prime <= max) { // 划掉余下prime倍数的数字 crossOff(flags, prime); // 找出下一个为true的值 prime = getNextPrime(flags, prime); if (prime >= flags.length) { break; } } return flags; } private void crossOff(boolean[] flags, int prime) { // 划掉余下为prime倍数的数字 // 我们可以从prime*prime开始 // 因为如果k*prime且k<prime,这个值早就在迭代之前就被划掉了 for (int i = prime * prime; i < flags.length; i = i + prime) { flags[i] = false; } } private int getNextPrime(boolean[] flags, int prime) { int next = prime + 1; while (next < flags.length && flags[next] == false) { next++; } return next; } public static void main(String[] args) { Prime_Sieve myPrime_Sieve = new Prime_Sieve(); boolean[] mySieveArray = myPrime_Sieve.sieveOfEratothenes(16); for (int i = 0; i <= 16; i++) { System.out.println(i + " is prime: " + mySieveArray[i]); } } }
优化
当然上面的代码中,还有一些地方可以优化,比如只将奇数放入数组所需空间即可减半。相关文章推荐
- 素数筛选法
- 不可逆加密,数字签名,Java实现,摘要,MD5,SHA128,SHA256
- 快速排序算法java代码实现
- 递归读取某个路径下的所有文件
- RSA算法简介及简单java实现类
- N皇后问题
- 选择排序,Java实现
- 冒泡排序,Java实现
- Runaway Robot游戏过关通用算法设计并java语言实现
- Leecode_Count Primes
- PAT 1004. 成绩排名 (20);java实现
- PAT 1005. 继续(3n+1)猜想 (25) ;JAVA实现
- PAT 1007. 素数对猜想 (20);判断一个数为素数;java实现
- 游戏引擎理论与实现系列01-生成窗口
- LeetCode:Reorder List C++与Java实现
- Amazon OA2准备——最大公约数
- Amazon OA2准备——迷宫
- Amazon OA2准备——01list
- Amazon OA2准备——循环链表插入
- Amazon OA2准备——01list