P4-統計素數個數-埃篩法
阿新 • • 發佈:2022-04-11
//統計素數個數 //素數:只能被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(intn) { //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; } }