埃拉托斯特尼筛法(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),比起简单的素数判断函数在处理大范围的区间时要高效得多。