当前位置:首页 > 牛客 > 牛客234957题:埃拉托斯特尼筛法高效求解质数计数问题

牛客234957题:埃拉托斯特尼筛法高效求解质数计数问题

2周前 (09-03)

牛客234957题:埃拉托斯特尼筛法高效求解质数计数问题 质数筛法 埃拉托斯特尼筛法 牛客题解 C++ 第1张

一、题目解读

牛客234957题要求计算给定整数n以内(不含n)的质数数量。质数即大于1且只能被1和自身整除的自然数。题目考察高效的质数筛法,需在保证正确性的基础上优化时间复杂度,避免暴力枚举导致的超时问题。

二、解题思路

采用经典的埃拉托斯特尼筛法解决该问题。核心思路如下:

1. 标记合数:从2开始,将每个质数的倍数全部标记为合数,剩余未标记的数即为质数。

2. 优化筛法边界。

3. 时间复杂度优化:通过避免重复标记,将复杂度降至O(nloglogn),远优于朴素试除法。

该解法简洁高效,是处理质数相关问题的基础算法之一。

三、解题步骤

1. 初始化标记数组:创建长度为n的布尔数组isPrime,默认所有数标记为质数(true),特殊处理0和1(非质数,置为false)。

2. 执行筛法:从2开始遍历,若当前数i为质数(即isPrime[i] == true),则将其所有倍数(从i2开始,步长为i)标记为合数(置为false)。

3. 统计质数数量:遍历数组,累计isPrime[i] == true的个数(i从2到n-1)。

通过以上步骤,利用筛法“由小到大逐步排除合数”的特性,高效获取质数集合。

四、代码与注释

class Solution {
public:
    int primesCount(int n) {
        if (n <= 2) return 0; // 小于2的数没有质数
        vector<bool> isPrime(n, true); // 初始化所有数为质数
        isPrime[0] = isPrime[1] = false; // 0和1不是质数

        // 埃拉托斯特尼筛法核心
        for (int i = 2; i * i < n; ++i) { // 遍历到√n即可
            if (isPrime[i]) { // 若i是质数
                // 将i的倍数标记为非质数
                for (int j = i * i; j < n; j += i) {
                    isPrime[j] = false;
                }
            }
        }

        // 统计质数数量
        int count = 0;
        for (int i = 2; i < n; ++i) {
            if (isPrime[i]) ++count;
        }
        return count;
    }
};

五、总结

本解法通过埃拉托斯特尼筛法实现了质数计数的优化求解,其核心在于“通过质数的倍数排除合数”,并通过边界优化减少循环次数。该算法不仅是解决质数问题的经典方法,也为更高效的线性筛法(如欧拉筛)奠定了基础。在实际应用中,对于中小规模范围内的质数统计场景,埃氏筛法具有极高的实用价值。


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣第71题:用栈轻松解决Unix路径简化问题

力扣第71题:用栈轻松解决Unix路径简化问题

题目解读:在Unix风格的文件系统中,我们经常需要处理各种复杂的路径表示。给定一个绝对路径字符串,我们需要将其转换为最简化的规范路径。规范路径要求:路径始终以斜杠'/'开头;两个目录名...

力扣933题:队列的妙用:如何高效统计最近请求

力扣933题:队列的妙用:如何高效统计最近请求

题目重解:我们需要设计一个能统计最近3000毫秒内请求次数的系统。每当新的请求到来时,它会带有时间戳t,我们需要返回过去3000毫秒内(包括当前)发生的请求总数。这就像是在时间轴上维护一个滑动窗口,只...

力扣540题:线性扫描法如何高效定位唯一数

力扣540题:线性扫描法如何高效定位唯一数

题目重解一个严格递增的有序数组中,除某个元素外,其余每个元素均出现两次。这个看似简单的条件背后隐藏着巧妙的规律——单一元素会打破数组的"成对对称性"。题目要求以O(log n)时间...

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

一、题目解读力扣3112题要求解决带时间限制的最短路径问题:给定一个有向图,节点具有消失时间,需计算从起点到各节点的最短路径,且路径总时间不能超过节点的消失时间。题目难点在于需在传统最短路径算法(如D...

【洛谷1184题解析】用C++高效解决地点匹配问题(附代码与解题思路)

【洛谷1184题解析】用C++高效解决地点匹配问题(附代码与解题思路)

一、题目解读洛谷1184题要求处理一组地点列表与行程记录,统计其中匹配的天数。题目难点在于高效处理带有空格的字符串输入,以及快速判断每日行程是否在高手可去地点集合中。需要兼顾输入格式解析与算法效率。二...

洛谷1220题解:动态规划与区间DP优化解法(附代码注释)

洛谷1220题解:动态规划与区间DP优化解法(附代码注释)

一、题目解读洛谷1220题要求计算在n个位置放置灯的情况下,通过关闭连续区间灯并移动至区间端点,使得总耗电量最小。需考虑灯的功率与位置差异,设计高效的算法求解最优策略。二、解题思路1. 动态规划 +...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。