这道题本身是靠通过筛选法求素数,然后他要求的第100002个素数,就比较尴尬了,还需要你懂得估算素数的分布公式。
/*
筛到第x个素数,需要数组准备多大?
素数分布定理:不大于n的素数的个数为:n / ln(n)
double t = 100;
while(t / Math.log(t) < x) t *= 1.1;
System.out.println(t);
*/
啊开辟一个这么大的数组,然后再去进行筛选。所谓筛选,就是假设数组长度为n,把一个数组里面,二的倍数、三的倍数、四的倍数…一直到n/2的倍数,这些位置的数组元素置为1,我大一的时候只知道这个方法是这么做。死记硬背的。现在倒是莫名其妙的理解了,好像那个时候什么都不理解……最后,只需要遍历一遍数组,把元素为0的下标输出来,就是素数啦~至于第100002 个,写一个变量m,每取到一个素数,就把m增1,知道m和要找的第多少个相等,输出来就好啦。
话不多述,直接上算法吧。
public class sushu {
public static void main(String[] args) {
int x=100002;
int n=1500000;
int a[]=new int[n];
for(int i=2;i<n/2;i++){
if(a[i]==1) continue;
for(int k=2;k<=n/i;k++){
if(i*k<n) a[i*k]=1;
}
}
int m=0;
for(int i=2;i<n;i++){
if(a[i]==0){
m++;
if(m==x){
System.out.println(i);
}
}
}
System.out.println(m);
}
}