1

噢莫加纳加加加  •  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;
}

评论:

请先登录,才能进行评论