计算质数

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

 继续修改

思路:和上面修改思路一样,这次我把判断素数语句封装成一个函数,看是否还是超时。

代码

 

posted @ 2020-12-02 12:46  萍2樱释  阅读(382)  评论(5编辑  收藏  举报