五、数学问题_05 &素数的筛法 &埃氏筛法(笔记)

在这里插入图片描述
这个筛法是利用数组,将数组能够被其他数除的数,删掉,保留素数来进行解答,要点在于如何开辟数组,也就是数组的长度,那么老师这里直接给了结果,如果要求第num个素数,那么👇

int n = 2;
while (n / Math.log(n) < num) {
	n++;
}
int[] arr = new int[n];

求出来的n就是数组的长度,然后就可以开始筛啦👇

int x = 2;
while (x < n) {
	if (arr[x] != 0) {
		x++;
		continue;
	}
	int k = 2;
	while (x * k < n) {
		arr[x * k] = -1;
		k++;
	}
	x++;
}

先看第二个while循环

如若现在x是2,k也是2,这里可以把x看成是倍数,k是下标,那么它们相乘后,就会把数组中,所有2的倍数的下标,所在的值,都置为-1,然后当x++后,也是同理,这时候x是3,就会把所有是3的倍数的下标,置为-1,那么这里还有个小优化,那就是上面的那个if判断,这个判断的意思是,如果x所在的这个下标,已经是-1了,那就不需要再去进行循环判定了,例:如果x这个时候是6,那就可以直接continue了,因为当x=6的时候,已经把所有2和3的倍数的下标,都标记过了,所以也不用再标记6了。那么相比说到这里,也不用再解释最外层的while循环了,下面直接贴完整代码👇

public class A032_素数的筛法_埃氏筛法 {

	public static void main(String[] args) {
		int n = 100000;
		f(n);
	}

	public static void f(int num) {
		int n = 2;
		while (n / Math.log(n) < num) {
			n++;
		}
		int[] arr = new int[n];
		
		int x = 2;
		while (x < n) {
			if (arr[x] != 0) {
				x++;
				continue;
			}
			int k = 2;
			while (x * k < n) {
				arr[x * k] = -1;
				k++;
			}
			x++;
		}
		
		int sum = 0;
		for (int i = 2; i < arr.length; i++) {
			if(arr[i]!=-1){
				sum++;
				if(sum == num){
					System.out.println(i);
					break;
				}
			}
		}
	}
}

这里求的是第100000个素数
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值