/**
* 功能:检查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; } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-06 11:15:22