posts - 56,  comments - 32,  views - 1851

埃拉托斯特尼筛法(Sieve of Eratosthenes)是一种用来生成一定范围内所有素数的算法。其基本思想是从小到大遍历每个数,如果当前数是素数,则将其所有的倍数标记为非素数。这个过程中,所有未被标记为非素数的数即为素数。

下面是使用埃拉托斯特尼筛法来计算区间 [x, y] 内的素数个数的修改后的代码:

 
#include <iostream>
#include <vector>

typedef long long ll;

std::vector<bool> sieve_of_eratosthenes(ll n) {
    std::vector<bool> is_prime(n + 1, true);//建成一个bool型向量,并且从0一直到n+1都初始化为true
    is_prime[0] = is_prime[1] = false;//特殊的两个数,专门处理
    for (ll i = 2; i * i <= n; i++) {
        if (is_prime[i]) {//如果i,是素数了,那么i的n倍就不是素数了,通过这个循环,标记他们
            for (ll j = i * i; j <= n; j += i) {
                is_prime[j] = false;
            }
        }
    }
    return is_prime;
}

int main() {
    ll x, y;
    std::cin >> x >> y;
    std::vector<bool> primes = sieve_of_eratosthenes(y);//通过调用这个函数,得到一系列的是否为素数的状态,并储存点bool型向量里面
    ll count = 0;
    for (ll i = x; i <= y; i++) {
        if (primes[i]) count++;
    }
    std::cout << count << std::endl;
    return 0;
}

在这个代码中,我们首先定义了一个 sieve_of_eratosthenes 函数来生成素数筛。然后在主函数中,我们使用这个筛来计算区间 [x, y] 内的素数个数。这种方法的时间复杂度为 O(n log log n),比起简单的素数判断函数在处理大范围的区间时要高效得多。

posted on   fafrkvit  阅读(77)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示