这个筛法是利用数组,将数组能够被其他数除的数,删掉,保留素数来进行解答,要点在于如何开辟数组,也就是数组的长度,那么老师这里直接给了结果,如果要求第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个素数