此博客連接:https://www.cnblogs.com/ping2yingshi/p/14073134.html
計算質數
題目鏈接:https://leetcode-cn.com/problems/count-primes/
題目
統計所有小於非負整數 n 的質數的數量。
示例 1:
輸入:n = 10
輸出:4
解釋:小於 10 的質數一共有 4 個, 它們是 2, 3, 5, 7 。
示例 2:
輸入:n = 0
輸出:0
示例 3:
輸入:n = 1
輸出:0
題解
思路:遍歷給的數之前的所有數,統計前面素數有多少,這里我猜測普通遍歷不是超時,估計就數太大,可能會超出Int 類型,事情沒有那么簡單。
方法:
1.先遍歷給的數之前所有數。
2.利用素數公式,只能被1整除的數為素數。這里判斷素數時,可以只判斷到數開根號大小即可。
3.判斷是否滿足素數的要求。
代碼
class Solution { public int countPrimes(int n) { if(n<3) return 0; int count=1; for(int i=3;i<n;i++) { int flag=1; for(int j=2;j<=Math.sqrt(i);j++) { if(i%j==0) { flag=0; break; } } if(flag==1) count++; } return count; } }
果然超時。
超時呢,想想吧3的倍數的數字排除,重新允許,還是超時。
class Solution { public int countPrimes(int n) { if(n < 3) return 0; int count = 1; for(int i = 3;i < n;i = i + 2) { int flag=1; for(int j = 3;j <= Math.sqrt(i);j++) { if(i % j == 0) { flag=0; break; } } if(flag==1) count++; } return count; } }
修改
思路
看了題解,思路是創建一個數組,先把數組全部置為true,然后利用雙重循環,第一層循環給的數,第二層循環判斷是否為素數。在第二層循環時,首先判斷數組中對應的位置上的值是否為true。如果為真說明是素數,才接着判斷每個數的倍數,素數的倍數一定不是素數,可以排除掉,在數組相應位置置為false。最后遍歷數組,計算數組中有多少true。
超時
class Solution { public int countPrimes(int n) { Boolean result[] =new Boolean [n]; int count=0; for(int i=0;i<n;i++) result[i]=true; for(int i=0;i<Math.sqrt(n);i++){ if(result[i]==true){ for(int j=i*i;j<Math.sqrt(n);j=j+i){ result[i]=false; } } } for(int i=0;i<n;i++) { if(result[i]==true) count++; } return count; } }
繼續修改
思路:和上面修改思路一樣,這次我把判斷素數語句封裝成一個函數,看是否還是超時。
代碼