刷题系列博客链接:机试题目

目录

题目及示例

我的题解


题目及示例

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

示例 1:

输入:n = 10
输出:4
解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
示例 2:

输入:n = 0
输出:0
示例 3:

输入:n = 1
输出:0

提示:

0 <= n <= 5 * 106

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-primes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

我的题解

避开10以内,避开偶数,避开大于10的个位数不是1379的。

判断到不是质数就停止小循环。

#include <math.h>int countPrimes(int n){// 质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数// 2,3,5,7,11,13,17,19,23int count = 0, i = 3, j = 3, ns = 0, flag = 0;if(n<3){ // 0,1return count;}else{ // n>=3++count; // 2for(i=3; i<n; i+=2){ // 奇数ns = (int) sqrt(i) + 1;if(i>10){if(i%10 != 5){ // 个位1379flag = 0;for(j=2; j<ns; ++j){ // 从2到根号iif(i%j == 0){flag=1;break; // 不加就超出时间限制,加了也很慢}}if(flag == 0){++count;}}}else{ // 3,5,7if(i==3 || i==5 || i==7){++count;}}}return count;}
}

由于还是太慢了,决定改进一下,看看官方的题解。果然快的一P。哈哈哈。

方法二:埃氏筛
枚举没有考虑到数与数的关联性,因此难以再继续优化时间复杂度。接下来我们介绍一个常见的算法,该算法由希腊数学家厄拉多塞(Eratosthenes)提出,称为厄拉多塞筛法,简称埃氏筛。

我们考虑这样一个事实:如果 x 是质数,那么大于 x 的 x 的倍数 2x,3x,… 一定不是质数,因此我们可以从这里入手。

我们设 isPrime[i]表示数 i 是不是质数,如果是质数则为 1,否则为 0。从小到大遍历每个数,如果这个数为质数,则将其所有的倍数都标记为合数(除了该质数本身),即 0,这样在运行结束的时候我们即能知道质数的个数。

这种方法的正确性是比较显然的:这种方法显然不会将质数标记成合数;另一方面,当从小到大遍历到数 x 时,倘若它是合数,则它一定是某个小于 x 的质数 y 的整数倍,故根据此方法的步骤,我们在遍历到 y 时,就一定会在此时将 x 标记为 isPrime[x]=0。因此,这种方法也不会将合数标记为质数。

当然这里还可以继续优化,对于一个质数 x,如果按上文说的我们从 2x 开始标记其实是冗余的,应该直接从 x⋅x 开始标记,因为 2x,3x,… 这些数一定在 x 之前就被其他数的倍数标记过了,例如 2 的所有倍数,3 的所有倍数等。

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/count-primes/solution/ji-shu-zhi-shu-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

int countPrimes(int n) {if (n < 2) {return 0;}int isPrime[n];memset(isPrime, 0, sizeof(isPrime));int ans = 0;for (int i = 2; i < n; ++i) {if (!isPrime[i]) { // 0ans += 1;if ((long long)i * i < n) { // x*x未超限for (int j = i * i; j < n; j += i) { //从x*x开始标记isPrime[j] = 1;}}}}return ans;
}

力扣题目系列:204. 计数质数相关推荐

  1. LeetCode Algorithm 204. 计数质数

    204. 计数质数 Ideas 质数的题目相对来说是个很经典的内容,虽然枚举也可以解决,但是复杂度很高,所以决定用埃氏筛来实现. 埃氏筛的基本思想是:从2开始,将每个质数的倍数都标记成合数. Code ...

  2. 力扣题目——429. N 叉树的层序遍历

    注:本文的代码实现使用的是 JS(JavaScript),为前端中想使用JS练习算法和数据结构的小伙伴提供解题思路. 描述 给定一个 N 叉树,返回其节点值的层序遍历.(即从左到右,逐层遍历). 树的 ...

  3. 力扣题目——637. 二叉树的层平均值

    注:本文的代码实现使用的是 JS(JavaScript),为前端中想使用JS练习算法和数据结构的小伙伴提供解题思路. 描述 给定一个非空二叉树, 返回一个由每层节点平均值组成的数组. 示例: 输入: ...

  4. 力扣题目——103. 二叉树的锯齿形层序遍历

    注:本文的代码实现使用的是 JS(JavaScript),为前端中想使用JS练习算法和数据结构的小伙伴提供解题思路. 描述 给定一个二叉树,返回其节点值的锯齿形层序遍历.(即先从左往右,再从右往左进行 ...

  5. 力扣题目——107. 二叉树的层序遍历 II

    注:本文的代码实现使用的是 JS(JavaScript),为前端中想使用JS练习算法和数据结构的小伙伴提供解题思路. 描述 给定一个二叉树,返回其节点值自底向上的层序遍历. (即按从叶子节点所在层到根 ...

  6. python力扣刷题记录——204. 计数质数

    题目: 统计所有小于非负整数 n 的质数的数量. 方法一: 暴力法 class Solution:def countPrimes(self, n: int) -> int:count = 0if ...

  7. 基本算法总结,力扣题目整理

    系统性学习算法,扎实您的打码基本功! 作为算法初学者的我从19年8月份开始在力扣学习算法,到现在AC了700多道题目. 随着打卡题目数量的增多,我发现算法常见考察的知识点大概有十几种,包括:二分,滑动 ...

  8. 力扣题目归类,顺序刷题不再难

    目录 介绍 前奏-基础篇 中篇-链表.树的相关操作 进阶-回溯.动态规划 脑筋急转弯 介绍 大家好,相信很多人都知道刷力扣的重要性,但是如果不能将题目很好的归类整理专一练习,而是东做一道西做一道,那么 ...

  9. 力扣 338. 比特位计数

    题目 给你一个整数 n ,对于 0 <= i <= n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n + 1 的数组 ans 作为答案. 示例 输入:n = 2 输 ...

  10. 312戳气球——力扣算法系列2020.07.19 Python

    第25天 2020.07.19 周日 难度系数:困难 题目:有n个气球,编号为0到n-1,每个气球上都标有一个数字,这些数字存在数组nums中. 现在要求你戳破所有的气球.如果你戳破气球i,就可以获得 ...

最新文章

  1. python怎么编程乘法口诀表_用python编写乘法口诀表的方法
  2. 回归方程的拟合优度检验_计量经济学第四讲(多元线性回归模型:基本假定,参数估计,统计检验)...
  3. sublime python运行快捷键_SublimeREPL执行Python快捷键
  4. oracle表是动态表怎么算排名,Oracle学习动态性能表
  5. CCActionEase想说爱你也不难(上)
  6. vue中 点击事件的写法_vue基础之事件v-onclick=函数用法示例
  7. 转载:KOF97键盘连招
  8. 【收藏】一份最新的、全面的NLP文本分类综述
  9. C#项目班级管理系统
  10. java学习心路历程
  11. Faithfully yours, nginx. 浏览器中显示包504,504 Gateway Time-out解决办法
  12. 记录一个解决mysql5.7.32-Access denied for user ‘‘@‘localhost‘ (using password NO)skip-grant-tables不生效的问题
  13. Java向word文档中添加水印
  14. 【文献阅读】Proximal Policy Optimization Algorithms
  15. 大根堆、小根堆(数组模拟操作)
  16. Google Pay支付遇到的问题
  17. python读音有道-Python 20行简单实现有道在线翻译的详解
  18. oracle 日志 aw,DBMS_AW_EXP: not AW$
  19. 2020年程序员客栈云端收入排行榜
  20. mapbox 支持国家2000 坐标系的数据

热门文章

  1. Quartz入门到精通
  2. 【Git/Github学习笔记】ubuntu系统下使用git命令与windows下的差别
  3. 【Git/Github学习笔记】Git起步
  4. 【VC++类型转换】CString类型到Char[]类型的转换
  5. leetcode刷题日记-leetcode刷题日记-71. 简化路径
  6. 批量修改txt文件名,删除相同部分
  7. java钝化_session的活化与钝化 (转)
  8. 银行数据仓库体系实践_案例:农发行数据交换共享平台建设实践分享
  9. Glide4.0源码全解析(二),load()背后的故事
  10. 卧槽!华为工程师总结的Java笔记,太优秀了!