算法学习——求区间的素数数目

素数数目
时间限制: 1 Sec 内存限制: 256 MB
提交: 60 解决: 13
[状态] [提交] [命题人:外部导入]
题目描述
给定区间[L,R],计算区间素数个数。
输入
输入两个整数L,R(1<=L<=R<=10^12,R-L<=1000000)
输出
输出一行表示区间素数的个数
样例输入 Copy
2 11
样例输出 Copy
5

题目来源:
http://oj.ecustacm.cn/problem.php?id=1087
思路参考:
https://blog.csdn.net/qq_32866009/article/details/76945320

#include <algorithm>
#include <iostream>
#include <vector>
typedef long long LL;
using namespace std;

const int MAXN = 1000007;
bool is_prime[MAXN];//大区间:统计l-r的素数数目(通过统计合数间接获取)
bool is_prime_small[MAXN];//小区间:2-sqrt(r)的素数

//区间筛法
int prime_num(LL l, LL r) {
	if (l < 2)l = 2;
	for (LL i = 0; i * i <= r; i++)is_prime_small[i] = true;
	for (LL i = 0; i <= r - l; i++)is_prime[i] = true;
	for (LL i = 2; i * i <= r; i++) {
		if (is_prime_small[i]) {
			for (LL j = 2 * i; j * j <= r; j += i) {//排除小区间的合数
				is_prime_small[j] = false;
			}
			for (LL j = max(2LL, (l + i - 1) / i) * i; j <= r; j += i) {//(l+i-1)/i为[l,r)区间内的第一个数至少为i的多少倍.
				is_prime[j - l] = false;
			}
		}
	}
	//统计
	int ans = 0;
	for (LL i = 0; i <= r - l; i++) if(is_prime[i]) ans++;
	return ans;
}

int main() {
	LL L, R;
	cin >> L >> R;
	cout << prime_num(L, R) << endl;
	return 0;
}
发布了25 篇原创文章 · 获赞 17 · 访问量 702

猜你喜欢

转载自blog.csdn.net/mu_mu_mu_mu_mu/article/details/105644478