噢莫加纳加加加 • 1天前
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int main() {
int L, R;
cin >> L >> R;
// 计算根号R,确定筛选所需的素数范围
int sqrtR = (int)sqrt(R);
// 第一步:筛选出[2, sqrtR]内的所有素数
vector<bool> sieve(sqrtR + 1, true);
sieve[0] = sieve[1] = false;
for (int i = 2; i * i <= sqrtR; ++i) {
if (sieve[i]) {
for (int j = i * i; j <= sqrtR; j += i) {
sieve[j] = false;
}
}
}
// 第二步:初始化区间[L, R]的素数标记
vector<bool> isPrime(R - L + 1, true);
// 用每个素数p标记区间内的合数
for (int p = 2; p <= sqrtR; ++p) {
if (sieve[p]) { // 只处理素数
// 计算区间内第一个能被p整除的数
long long start = max((long long)p * p, (L + p - 1LL) / p * p);
// 标记所有p的倍数为合数
for (long long j = start; j <= R; j += p) {
isPrime[j - L] = false;
}
}
}
// 统计素数个数
int count = 0;
for (bool prime : isPrime) {
if (prime)
count++;
}
cout << count << endl;
return 0;
}
评论:
请先登录,才能进行评论