target:Count the number of PRime numbers less than a non-negative number n
我第一次編寫的解決代碼,時間復雜度是O(n2),在40多萬時就掛了。
//O(n2),cost too much time public int simplecountPrimes(int n) { int num = 0; for (int i = 2; i < n; i++) { boolean flag = isPrimer(i); if(flag == true){ num++; } } return num; } public boolean isPrimer(int m){ boolean flag = true; for (int i = 2; i < m; i++) { int remainder = m%i; if(remainder==0){ flag = false; break; } } return flag; }這里著重介紹埃拉托斯特尼篩法(Sieve of Eratosthenes):
核心思想:逐個遍歷數字,數字的倍數必然不是素數,直接去除。
p * q = n; 當p大于q之后,內容出現重復,故我們只需要思考p <√n的開方內的數字的遍歷。
同樣的根據上面這行思想,當我們對√n以下數字遍歷時,我們考慮的倍數的起點一定是i * i (此時正在遍歷的數字) //Sieve of Eratosthenes, O(nlglgn) public int countPrimers(int n){ int num = 0; boolean[] isPrimers = new boolean[n]; for (int i = 0; i < isPrimers.length; i++) { isPrimers[i] = true; } for (int i = 2; i*i < n; i++) { if(!isPrimers[i]){ continue; } for(int j = i*i;j < n ;j += i){ isPrimers[j] = false; } } for (int i = 2; i < n; i++) { if(isPrimers[i] == true){ num++; } } return num; }
新聞熱點
疑難解答