问题描述:

统计所有小于非负整数 n 的质数的数量。

示例:

输入: 10

输出: 4

解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。

这是一道简单题,但是却并没有那么直接的简单。

枚举暴力法是肯定不行的,时间效率太低。于是介绍解决这个问题的一个著名算法--Eratosthenes筛选法

来自 https://www.cnblogs.com/color-my-life/p/3265236.html 的解释,我觉得非常通俗易懂。

首先假设要检查的数是N好了,则事实上只要检查至N的开根号就可以了,道理很简单,假设A * B = N,如果A大于N的开根号,则事实上在小于A之前的检查就可以先检查到这个数可以整除N。

不过在程式中使用开根号会精确度的问题,所以可以使用 i*i <= N进行检查,且执行更快 。

再来假设有一个筛子存放1~N,例如:

2 3 4 5 6 7 8 9 10 11 12 ........N

先将2的倍数筛去:

2 3 5 7 9 11 13........N

再将3的倍数筛去:

2 3 5 7 11 13 17 19........N

再来将5的倍数筛去,再来将7的质数筛去,再来将11的倍数筛去........,如此进行到最后留下的数就都是质数,这就是Eratosthenes筛选方法(Eratosthenes Sieve Method)

检查的次数还可以再减少,事实上,只要检查6n+1与6n+5就可以了,也就是直接跳过2与3的倍数,使得程式中的if的检查动作可以减少。

class Solution {
public int countPrimes(int n) {
int count = 0;
int i;
boolean[] b = new boolean[n];
for (i = 2; i < n; i++)
b[i] = true;
i = 2;
while (i * i < n) {
if (b[i]) {
count++;
int k = 2 * i;
while (k < n) {
b[k] = false;
k += i;
}
}
i++;
}
while (i < n) {
if (b[i])
count++;
i++;
}
return count;
}
}

几乎相同的算法,更好看的写法(理论上效率应该比上面那个要低一点点)

class Solution {
public int countPrimes(int n) {
int count = 0;
boolean[] booleans = new boolean[n];
for (int i = 2; i < n; i++) {
if(!booleans[i]){
count++;
for (int j = i; j < n; j=j+i) {
booleans[j] = true;
}
}
}
return count;
}
}

【LeetCode】204.计数质数的更多相关文章

  1. Java实现 LeetCode 204 计数质数

    204. 计数质数 统计所有小于非负整数 n 的质数的数量. 示例: 输入: 10 输出: 4 解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 . class Solutio ...

  2. Leetcode 204计数质数

    计数质数 统计所有小于非负整数 n 的质数的数量. 示例: 输入: 10 输出: 4 解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 . 比计算少n中素数的个数. 素数又称质 ...

  3. 力扣(LeetCode)计数质数 个人题解

    统计所有小于非负整数 n 的质数的数量. 示例: 输入: 10 输出: 4 解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 . 一般方法,也就是一般人都会用的,将数从2到它本 ...

  4. “计数质数”问题的常规思路和Sieve of Eratosthenes算法分析

    题目描述 题目来源于 LeetCode 204.计数质数,简单来讲就是求"不超过整数 n 的所有素数个数". 常规思路 一般来讲,我们会先写一个判断 a 是否为素数的 isPrim ...

  5. Leecode刷题之旅-C语言/python-204计数质数

    /* * @lc app=leetcode.cn id=204 lang=c * * [204] 计数质数 * * https://leetcode-cn.com/problems/count-pri ...

  6. [LeetCode] 204. Count Primes 计数质数

    Description: Count the number of prime numbers less than a non-negative number, n click to show more ...

  7. LeetCode 204. Count Primes计数质数 (C++)

    题目: Count the number of prime numbers less than a non-negative number, n. Example: Input: 10 Output: ...

  8. [LeetCode] 204. Count Primes 质数的个数

    Count the number of prime numbers less than a non-negative number, n. Example: Input: 10 Output: 4 E ...

  9. LeetCode 204. Count Primes (质数的个数)

    Description: Count the number of prime numbers less than a non-negative number, n. 题目标签:Hash Table 题 ...

随机推荐

  1. StackOverflow上面 7个最好的Java答案

    StackOverflow发展到目前,已经成为了全球开发者的金矿.它能够帮助我们找到在各个领域遇到的问题的最有用的解决方案,同时我们也会从中学习到很多新的东西.这篇文章是在我们审阅了StackOver ...

  2. redis学习第三天(Java使用redis)

    Java使用redis首先需要一个jar包,jedis.jar,这边给出下载地址:https://mvnrepository.com/artifact/redis.clients/jedis,要下载最 ...

  3. golang 写文件--详细解释

    1,不覆盖指定的文件 先看代码怎么写,下面再具体解释. func writeToFile(msg string) { f, err := os.OpenFile("/home/mingbai ...

  4. 动态路由协议与RIP配置

    一.动态路由的概述 二.RIP路由协议工作原理 三.水平分割 四.RIP路由协议v1与v2的区别 五.实验配置 一.动态路由的概述 1.定义 动态路由是指利用路由器上运行的动态路由协议定期和其他路由器 ...

  5. 使用远程Docker进行集成测试

    目录 需求背景 使用docker进行环境搭建 以中心化的docker server改进集成测试 Docker Server远程链接配置 Testcontainers 框架 Testcontainers ...

  6. Android开发万能Utils(工具大全)

    AndroidUtils Android开发不得不收藏的Utils About AndroidUtilCode  是一个强大易用的安卓工具类库,它合理地封装了安卓开发中常用的函数,具有完善的 Demo ...

  7. .Net Core with 微服务 - Consul 配置中心

    上一次我们介绍了Elastic APM组件.这一次我们继续介绍微服务相关组件配置中心的使用方法.本来打算介绍下携程开源的重型配置中心框架 apollo 但是体系实在是太过于庞大,还是让我爱不起来.因为 ...

  8. POJ 1015 Jury Compromise dp

    大致题意: 从n个候选人中选出m个人作为陪审团.为了让陪审团的选择更公平,辩方和控方都为这n个候选人给出了满意度(辩方为D[j],控方为P[j],范围0至20).现在要使得选出的m位候选人的辩方总和与 ...

  9. 利用ONT测序检测真核生物全基因组甲基化状态

    摘要 甲基化在真核生物基因组序列中广泛存在,其中5mC最为普遍,在真核生物基因组中也有发现6mA.捕获基因组中的甲基化状态的常用技术是全基因组甲基化测序(WGBS)和简化甲基化测序(RRBS),而随着 ...

  10. Linux安全攻防:使用TRAP实现持续控制和提权

    ATT&CK TRAP技术说明 在ATT&CK中,TRAP属于事件触发执行的一种技术,可以用于持续控制(persistence)和提权(privilege escalation). T ...