1. 程式人生 > 其它 >P4-統計素數個數-埃篩法

P4-統計素數個數-埃篩法

//統計素數個數
//素數:只能被1和自身整除的自然數,0、1除外
public class P4 {
    public static void main(String[] args) {
        System.out.println(eratosthenes(100));
    }
 
    //非素數(合數)   12 = 2 * 6
    //埃篩法
    /*
        假設找到2是素數,那麼讓他倍增,即4、6、8、10....都不是素數
        所以當遍歷到4的時候,就可以跳過,減少判斷次數
    * */
    public static int eratosthenes(int
n) { //todo n太大的時候還能這樣玩嗎? boolean[] isNotPrime = new boolean[n]; //預設false,代表素數,is not素數嗎,false,就是素數 int count = 0; for (int i = 2; i < n; i++) { if (!isNotPrime[i]) { count++; //j+=i就是倍增,2i、3i、4i、5i.... // for (int j = 2 * i; j < n; j += i) {
//j 合數的標記位 // isNotPrime[j] = true; // } //需要優化,出現相同的遍歷標記 //i=2,4、6、8、10、12...都已經標記了 //然後i=3,6、9、12...又再次標記 //從i*i開始標記即可,前面的已經會被更之前的標記過了 //即i=2,4、6、8、10、12...已經標記了 //然後i=3,只需要從9開始標記,雖然後面還是會有重複的(如12),只是減少前面的遍歷次數(如6),後面的遍歷屬於未知
//todo 感覺還是能再優化 for (int j = i * i; j < n; j += i) { //j 合數的標記位 isNotPrime[j] = true; } } } return count; } }