zoukankan      html  css  js  c++  java
  • 计算质数

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

     继续修改

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

    代码

  • 相关阅读:
    CodeForces 656B
    时间限制
    哈哈
    &1的用法
    codeforces 385 c
    hdu 1176 免费馅饼
    poj 1114 完全背包 dp
    poj 1115 Lifting the Stone 计算多边形的中心
    jar包解压
    重定向
  • 原文地址:https://www.cnblogs.com/ping2yingshi/p/14073134.html
Copyright © 2011-2022 走看看