给t给样例,每个样例a,b两个数,求区间[a,b]内素数的个数,(1 ≤ a ≤ b < 2^31, b - a ≤ 100000).
区间很大,区间差不大
// LightOJ - 1197 区间素数筛
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 500000;
bool sprime[maxn],prime[maxn];
int solve(ll a,ll b){
memset(sprime,0,sizeof(sprime));
memset(prime,0,sizeof(prime));
for(int i=2;(ll)i*i<b;i++){
if(!sprime[i]){
//素数筛小区间 [2,sqrt(b)]素数
for(int j=2*i;(ll)j*j<b;j+=i){
sprime[j] = true;
}
for(int j=max(2ll,(a+i-1)/i)*i;j<=b;j+=i){
prime[j-a] = true;
}
}
}
int ans = 0;
for(int i=0;i<=b-a;i++){
if(!prime[i])ans++;
}
return ans;
}
int main()
{
int cnt=1,t,ans;
ll a,b;
scanf("%d",&t);
while(t--){
scanf("%lld %lld",&a,&b);
ans = solve(a,b);
if(a==1)ans--;//1不是素数
printf("Case %d: %d\n",cnt++,ans);
}
return 0;
}
/*
3 ans:
2 36 11
3 73 20
3 11 4
*/
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有