埃及筛---获取一定范围内的所有素数

本文介绍了如何使用埃及筛法快速判断一定范围内数的素性,通过从2开始遍历并标记倍数,有效降低算法复杂度。作者提供了Java代码示例实现getPrime方法。
摘要由CSDN通过智能技术生成

素数筛用于快速判断一定范围内的所有数是不是素数,常见的有暴力法、埃及筛、欧拉筛,算法复杂度从高到低,下面介绍一下埃及筛:

数学基础:

对于任意一个大于等于2的正整数K,都可以分解成n个素数的乘积,比如 24 = 2 ^ 2 * 3 ^ 2。

主要思路:

所以我们可以从2开始遍历每个数(范围:2~Math.sqrt(n)),如果当前的数是素数,则将它的倍数筛去,当遍历到一个合数时,它已经被之前的素数给筛掉了。

public class Prime{
	
	public boolean[] getPrime(long n){
		int len = (int) Math.sqrt(n);
		// 用于记录下标i的数字是否是素数(质数),默认都是素数
		boolean[] notPrime = new boolean[(int) (len)];
		//从2开始,如果当前是素数,那么它的倍数就是合数。
		for(int i = 2; i * i <= len; i++) {
			if(!notPrime[i]) {
				// i * (i - 1), i * (i - 2), ... i * 2, 
				// 以上 数字,也就是i的2~(i - 1)的倍数,在之前已经筛过了,所以从i * i开始
				for(int j = i * i; j <= len; j += i) {
					notPrime[j] = true;
				}
			}
		}
		return notPrime;
	}
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值