埃拉托斯特尼筛法(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 2024-06-10 11:40  fafrkvit  阅读(57)  评论(2编辑  收藏  举报