LeetCode Count Primes

来源:互联网 发布:淘宝网藏族服装 编辑:程序博客网 时间:2024/05/20 03:46

题目:

Count the number of prime numbers less than a non-negative number, n

题意:

统计比n小的整数下的质数个数。

解题思路:

首先一拿到这题,LZ的思路就是很简单的采用遍历,然后依次去判断每个数是否能被2整除,如果这个数能被某个数整除,那么就说明它不是质数,而且这里对于每个数不用循环到n位置,只要到sqrt即可。这是一个小技巧。但是这种方法实现的导致超时,因为要两层循环,而且循环体里又是做除的判断,所以非常麻烦,因此在考虑用下面这个方法,这个方法是一种非常好的改进:因为在n个数时,从2开始,如果2的倍数小于n的,那么一定不是质数;同理,依次考虑3的倍数,4的倍数等等。但是这里又有一个小技巧,比如10 = 5 * 2,那么在考虑2的倍数的时候,其实已经将这个10去掉了,所以考虑5的倍数时候,这个10就不用再考虑了。所以可以考虑从i * i的倍数考虑,然后间隔为i。这样不用做除的运算,而且用了一个boolean的数组,所以如果以后要求小于n的质数的情况下,可以考虑用这种做法,这种做法比单纯的用除法去做,效率要好很多。所以非常推荐用这种。

public class Solution {    public int countPrimes(int n)     {        boolean[] isPrime = new boolean[n];        for (int i = 2; i < n; i++)         {          isPrime[i] = true; //先用一个boolean数组来初始化,所有元素都为true        }       // Loop's ending condition is i * i < n instead of i < sqrt(n)       // to avoid repeatedly calling an expensive function sqrt().       for (int i = 2; i * i < n; i++)        {          if (!isPrime[i]) continue; //如果某个数还是false,也就是说不可能是质数,那么就跳过这次循环          for (int j = i * i; j < n; j += i)   //否则就采用从这个数的平方项开始继续执行循环          {             isPrime[j] = false;    //碰到这个数的倍数的,那么就变为false;          }       }       int count = 0;       for (int i = 2; i < n; i++)        {          if (isPrime[i]) count++;       }       return count;    }}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 摔到了腿受伤了怎么办 骑车摔倒了肿了怎么办 生活大冒险老婆失踪了怎么办 手机qq图裂了怎么办 qq发的图裂了怎么办 抖音账号搬运多怎么办 别人搜不到我QQ怎么办 qq号被限制解封怎么办 买的桌子会晃怎么办 车子座椅皮坏了怎么办 裤子被椅子刮了怎么办 脚麻了被别人动怎么办 毛孔又粗又黑怎么办 手臂睡觉压麻了怎么办 睡觉压的胳膊麻怎么办 摔跤摔到腰肿了怎么办 牛奶喝多了拉稀怎么办 doc文档下载是乱码怎么办 家人被教练技术骗了怎么办 十个月宝宝不爱喝水怎么办 离婚后孩子找爸爸怎么办 离婚后孩子要找爸爸怎么办 断奶期间胸涨的难受怎么办 断奶胸涨的很疼怎么办 过了麦季身上老痒怎么办 过麦时候皮肤痒怎么办 颈部起红疙瘩痒怎么办 脚底痒身上痒该怎么办 生完孩子屁股疼怎么办 pr打开工程文件无响应怎么办 娃娃和老师有隔阂了怎么办 大人字写得不好怎么办 不会写好看的字怎么办 无限量流量限速了怎么办 长期化妆后皮肤变黄怎么办 手机密码忘记了打不开怎么办 手机解压包不知道密码怎么办 手机屏图标没了怎么办 b站页面卡顿怎么办 被全景视觉骗了怎么办? 逆战进去没声音怎么办