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

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

3个月前 (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;
    }
};

五、总结

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


原创内容 转载请注明出处

分享给朋友:

相关文章

70.爬楼梯|三步破解动态规划核心奥秘

70.爬楼梯|三步破解动态规划核心奥秘

题意新解:站在楼梯底仰望n级台阶,每步可选1或2阶,最终的路径组合犹如斐波那契数列般展开。比如到达第3阶的路径可由第1阶跨两步,或第2阶跨一步构成,这种递推规律揭示了两两相邻状态间的紧密关联。思路解析...

征服力扣704题:三步掌握经典二分查找算法

征服力扣704题:三步掌握经典二分查找算法

题目重解我们面对的是算法领域最经典的二分查找问题:在一个已排序的整数数组中,快速定位目标值的位置。就像在一本按字母顺序排列的字典中查找单词,我们不需要逐页翻阅,而是通过不断折半的方式快速缩小搜索范围,...

IOI 1994 洛谷1216:如何用动态规划高效解决数字三角形问题?附完整代码解析

IOI 1994 洛谷1216:如何用动态规划高效解决数字三角形问题?附完整代码解析

题目重解给定一个由数字组成的三角形结构,从顶部出发,每次可以移动到下方相邻的数字,最终到达底部。我们的目标是找到一条路径,使得路径上经过的数字总和最大。这个问题在实际中有许多应用场景,如最优路径规划、...

手搓顺序表类代码注释与详解:从零实现动态数组(新手教程)

一、简介和特点顺序表(Sequential List)是数据结构中基础的一种线性表,其特点是将数据元素存储在连续的内存空间中。通过数组实现,支持随机访问(即通过索引直接访问元素),适用于频繁随机读取的...

标题:洛谷B3617题解析:八进制转十六进制算法实现与优化(附AC100代码)

标题:洛谷B3617题解析:八进制转十六进制算法实现与优化(附AC100代码)

一、题目解读洛谷B3617题要求将输入的八进制字符串转换为十六进制表示。题目需处理大数场景,且对输入合法性有明确限制(长度不超过1000,仅包含0-7字符)。由于八进制与十六进制无法直接转换,需借助十...

牛客14496题解:括号最大深度问题(栈思想与代码优化)

牛客14496题解:括号最大深度问题(栈思想与代码优化)

一、题目解读牛客14496题要求计算给定括号字符串中的最大深度。例如,对于字符串 "(()())",最大深度为2。题目考察对括号嵌套结构的理解,以及如何通过编程找到最深嵌套层次。二...

发表评论

访客

看不清,换一张

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