計算質數


此博客連接: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;
    }
}

 繼續修改

思路:和上面修改思路一樣,這次我把判斷素數語句封裝成一個函數,看是否還是超時。

代碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM