9.7数学与概率(七)——检查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;
		}
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值