0
点赞
收藏
分享

微信扫一扫

枚举——使用厄拉多塞筛法计数质数

dsysama 2022-01-20 阅读 51

一、问题

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

示例:
在这里插入图片描述
提示: 0 <= n <= 5 * 106

二、解题思路

厄拉多塞筛法

  • 先将 2~n 的各个数放入表中
  • 然后在2的上面画一个圆圈,然后划去2的其他倍数;
  • 第一个既未画圈又没有被划去的数是3,将它画圈,再划去3的其他倍数;
  • 现在既未画圈又没有被划去的第一个数 是5,将它画圈,并划去5的其他倍数……
  • 依次类推,一直到所有小于或等于 n 的各数都画了圈或划去为止。这时,表中画了圈的以及未划去的那些数正好就是小于 n 的素数。

注意:其实当要画圈的素数的平方大于 n 时,后面没有划去的数都是素数

三、代码

int countPrimes(int n){
    if(n < 3)
        return 0;
    int number[n];
    int count = 0; // 合数计数
    // 初始化
    for(int i = 0; i < n; i++)
        number[i] = 1;
    
    for(int i = 2; i * i <= n; i++){
        if(number[i] == 0)
            continue;
        for(int h = 2 * i; h < n; h += i){
            if(number[h]){
                number[h] = 0;
                count++;
            }
        }
    }
    int ret = n - 2 - count;
    return ret;
}
举报

相关推荐

0 条评论