題目:求第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);
}
}
}
}