题目:求第100001个素数是什么?
质数(prime number)又称素数,有无限个。除了1和它本身以外不再有其他的除数整除。根据算术基本定理,每一个比1大的整数,要么本身是一个质数,要么可以写成一系列质数的乘积,最小的质数是2。
public class Main {
//求第10001个素数
//2 3 5
public static void main(String[] args) {
//为从1~N的所有整数开辟一个数组空间,标记该数是否为素数(0为素数)
int N = 1000*1000*10;
boolean[] a = new boolean[N];
//接下来进行筛选法
/*在这里,筛选法是一个两层的for循环,两个关键点
*1、思路是,i * k 如果还在 N 之内,即该数可以被i*j整除,不满足素数,筛掉,标1
*2、i与j的循环条件,ij均从2开始循环,那么试想,i*k在满足<N时,他们的最大是多少呢
* 明显,i=2;i<N/2 i最大为 N/2
* 相应的,i*j<N, j=2;j<N/i
*Ps. ij为什么从2开始?因为若ij为1的话,乘得的数可能为素数,例如1*1=1;1*3=3。。。
* ij从2开始的话,第一个判断的数为4,而2、3正好都为素数,所以置之不理即可。
* 对于1不计入素数,所以本题的循环大多从2 开始,直接略过1。
**/
**for(int i=2; i<N/2; i++){
if(a[i] == true) continue;
for(int j=2; j<=N/i; j++){
if(i*j<N) a[i*j] = true;
}
}**//筛选结束
int x = 100001;
int count=0;
//从1开始记录素数,遇到a[i]=false就加1,直到遇到第x个,输出i
for(int i=2;i<N;i++){
if(a[i]==false){
count++;
if(count == x)
System.out.println(i);
}
}
}
}