/**
* 功能:检查n能否被素数整除。
* 功能:检查n能否被素数整除。
*/
/**
* 生成素数序列:埃拉托斯特尼筛法
* 原理:剔除所有可能被素数整除的非素数。
* 思路:列出到max为止的所有数字。
* 1)划掉所有可能被2整除的数(2保留)。
* 2)找到下一个素数(即下一个不会被划掉的数),并划掉所有可被它整除的数。
* 3)最终得到2到max之间的素数序列。
* 可优化为:只将奇数放进数组,空间即可减半。
* @param max
* @return
*/
public static boolean[] sieveOfEratosthenes(int max){
boolean[] flags=new boolean[max+1];//从0开始,共max+1位。便于元素的下标与数字相对应
int count=0;
init(flags);//将flags中除0,1元素除外的所有元素设为true
int prime=2;
while(prime<=max){
//划掉余下为prime倍数的数字
crossOff(flags,prime);
//找出下一个位true的值
prime=getNextPrime(flags,prime);
if(prime>=flags.length)
break;
}
return flags;
}
//划掉余下为prime倍数的数字
public static void crossOff(boolean[] flags,int prime){
/**
* 划掉余下为prime倍数的数字,可以从prime*prime开始,因为如果k*prime且k<prime,
* 这个值早就在之前的迭代里划掉了。
*/
for(int i=prime*prime;i<flags.length;i+=prime){
if(i%prime==0)
flags[i]=false;
}
}
//找出下一个位true的值
public static int getNextPrime(boolean[] flags,int prime){
int next=prime+1;
while(next<flags.length&&!flags[next]){
next++;
}
return next;
}
public static void init(boolean[] flags){
for(int i=0;i<flags.length;i++){
flags[i]=true;
}
}