Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >c/c++补完计划(三): 素数统计

c/c++补完计划(三): 素数统计

作者头像
sean_yang
发布于 2020-07-22 08:10:16
发布于 2020-07-22 08:10:16
37700
代码可运行
举报
文章被收录于专栏:Sorrower的专栏Sorrower的专栏
运行总次数:0
代码可运行

前言

统计所有小于非负整数 n 的质数的数量 这是一道leetcode简单级别的, 本来没啥说的, 然后我发现了欧拉筛选法.

常规方法

常规思路就是对每个数x进行检测, 用x除以2到根号x, 有一个可以整除, 就不是素数. 优点是连数组或者vector都不需要, 有一个算一个, 很节省空间.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bool isPrime(int i) {
    for (int j = 2; j * j <= i; ++j) {
        if (i % j == 0)return false;
    }

    return true;
}

int countPrimes(int n) {
    if (n < 2) {
        return 0;
    }

    int count = 0;
    for (int i = 2; i < n; ++i) {
        if (isPrime(i)) {
            ++count;
        }
    }

    return count;
}

欧拉筛选法

是一种空间换时间的策略. 首先申请一个n大小的bool类型的vector, 存储实时判断结果. 然后用另一个vector存储素数. 欧拉筛选法的核心思想就是, 如果一个数i可以整除prime[j], 那么i * prime[j + 1]肯定是合数, 因为它至少可以被prime[j]整除. 反应在代码上就是直接跳出循环. 内层循环相比外层可以忽略不计, 时间复杂度为O(n).

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int countPrimes(int n) {
    if (n < 2) {
        return 0;
    }

    vector<bool> tmp(n, false);
    vector<int> prime;

    for (int i = 2; i < n; ++i) {
        if (!tmp[i]) {
            prime.push_back(i);
        }
        for (int j = 0; j < prime.size() && i * prime[j] < n; ++j) {
            tmp[i * prime[j]] = true;
            if (i % prime[j] == 0) break;
        }
    }

    return prime.size();
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
golang 刷leetcode 数学基础(1)素(质)数
此方法的问题在于许多不必要的计算,因此可以想到用空间换时间:筛选出来的素数的倍数都可以标记为合数
golangLeetcode
2022/08/02
3050
面试官本想拿一道求素数搞我,但被我优雅的"回击"了
现在的面试官,是无数开发者的梦魇,能够吊打面试官的属实不多,因为大部分面试官真的有那么那几下子。但在面试中,我们这些小生存者不能全盘否定只能单点突破—从某个问题上让面试官眼前一亮。这不,今天就来分享来了。
bigsai
2020/12/17
4310
面试官本想拿一道求素数搞我,但被我优雅的"回击"了
万人千题——素数筛选
还是要优化,首先分析为什么超时,发现主要的原因是从2开始每一个数都进行了素数的判断,所以说浪费了时间,在上一篇素数的判断,我们提到可以使素数*相同的倍数,来减少判断的次数。 从而引出了Eratosthenes筛选
秋名山码神
2022/12/13
2590
万人千题——素数筛选
leetcode-204-Count Primes
题目描述: Count the number of prime numbers less than a non-negative number, n. 要完成的函数: int countPrimes(int n)  说明: 1、题目看上去非常简单和熟悉。给定一个非负数n,要求返回小于n的所有素数的个数。 2、处理一下边界条件,n<=2时返回0,n=3时返回1,n=4时返回2。 3、传统方法: 对于小于n的每个数i,判断i是不是素数。判断方法是对于每个大于等于2且小于等于i/2的数,确定i能否整除这个数。
chenjx85
2018/05/21
6550
因子和——解题报告
躺平几天了,快来写一篇解题报告,前面我们写了因子的分解,这次来写因子和。 四因数 思路 : 存在以下俩种情况 1. 俩个素数的乘积 2.一个素数的三次幂 想到了俩种解法: 暴力 class Solution { public: int sumFourDivisors(vector<int>& nums) { int ans = 0; for (int num: nums) { // factor_cnt: 因数的个数 /
秋名山码神
2022/12/13
1730
Java实现质数筛的三种方法
今天在做一个算法题的时候遇到一个需要求质数的情况,但是本人比较菜只会暴力做法,所以在此记录学习一下质数筛选除了暴力以外的其它做法!
才疏学浅的木子
2023/10/17
4210
Java实现质数筛的三种方法
素数推断算法(高效率)
关于素数的算法是信息学竞赛和程序设计竞赛中常考的数论知识,在这里我跟大家讲一下寻找一定范围内素数的几个算法。看了以后相信
全栈程序员站长
2022/07/14
3740
LeetCode笔记:204. Count Primes
我们知道最简单的质数就是2,3,5。。。那怎么计算往后的质数呢?质数的定义是除了自己以外没有任何因子,也就是不被任何数整除,也就是说,不会被这个数前面的任何质数和非质数整除,其实非质数也可以被质数整除,比如4被2整除,所以问题可以归结为:没遇到一个数,判断它是否能被前面的某一个质数整除。
Cloudox
2021/11/23
2810
Swift 计数质数 - LeetCode
LeetCode.jpg 题目:计数质数 描述:统计所有小于非负整数 n 的质数的数量。 案例1: 输入: 10 输出: 4 解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。 质数的定义:质数 方案一:判断质数 代码一: func countPrimes(_ n: Int) -> Int { if n < 3 { return 0 } var count = 1 //判断大于3的奇数 for i in 3..<n
韦弦zhy
2018/09/11
1.6K0
Swift 计数质数 - LeetCode
求素数个数
本文讲述如何通过修改求素数的方法,使得在 n<=10^9 范围内,求前 n 个素数之和的算法的时间复杂度低于 2^32。首先介绍经典求素数方法,然后给出新算法的实现,并对比不同算法的时间复杂度。
高爽
2017/12/28
1.4K0
求素数个数
三种素数筛的比较
在自然数集中,质数的数量不多而且分布比较稀疏,对于一个整数N,不超过N的质数大概有N/lnN个,即每lnN个数中可能会有一个质数。
ACM算法日常
2018/12/13
1.4K0
世界总决赛选手带你玩转数论 1——素数及素性检测
笔者曾获得 ICPC 2020 世界总决赛资格,ICPC 2020 亚洲区域总决赛第五名。
ACM算法日常
2021/06/16
9020
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
简介:数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
GeekLiHua
2025/01/21
1150
【模板小程序】求M~N范围内的质数个数
1 /* 2 本程序说明: 3 4 [编程题] 求素数 5 时间限制:2秒 6 空间限制:32768K 7 输入M、N,1 < M < N < 1000000,求区间[M,N]内的所有素数的个数。素数定义:除了1以外,只能被1和自己整除的自然数称为素数 8 输入描述: 9 两个整数M,N 10 11 12 输出描述: 13 区间内素数的个数 14 15 输入例子1: 16 2 10 17 18 输出例子1: 19 4 20 21 */ 22 //筛法求N以内的素数(普通法+优化
xiaoxi666
2018/10/29
1.5K0
204. 计数质数
解1:小学数学没有学好,先来一下质数定义。质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。暴力拆解,时间复杂度达不到,数很大时,耗时长。看解2。
张伦聪zhangluncong
2022/10/26
6570
质数筛与欧拉函数
我们提前设置一个标记数组prime[N] ,提前标记好数字的质数状态,这样就能减少重复判断。
fishhh
2022/08/30
7200
质数筛与欧拉函数
java素数筛选法
判断是否为素数 对于一个任意一个正整数,如果它只能被自身或1整除,称其为素数,否则为合数。1比较特殊,既不是质数也不是合数。
lexingsen
2022/02/24
6100
java素数筛选法
C语言素数优化方法
题目:求1~N范围中的素数。k为当前数值,j为被除数 素数:一个大于1的自然数中,除了1和本身外无法整除其余数的数值。
CtrlX
2022/11/16
3.3K0
五分钟小知识:如何用算法高效寻找素数?
不要觉得素数的定义简单,恐怕没多少人真的能把素数相关的算法写得高效。本文就主要聊这样一个函数:
五分钟学算法
2019/10/09
4720
五分钟小知识:如何用算法高效寻找素数?
C/C++中的素数判定
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的博客 🍊个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 🥭本文内容:C/C++中的素数判定 更多内容请见👇 C/C++中的基础数据类型 C与C++的最常用输入输出方式对比 C语言竟支持这些操作:C语言神奇程序分享 ---- 本文目录 1.什么是素数 2.素数的两种判断方法 2.1 暴力法 2.1.1 从 2 到 √n 2.1.2 6n-1与6n+1 2.2 筛法 2.2.1 埃
小嗷犬
2022/11/15
8920
C/C++中的素数判定
相关推荐
golang 刷leetcode 数学基础(1)素(质)数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验