B - Primes on Interval
题目

思路:
寻找区间 [a,b]中最小的区间长度 l ,使得在区间里有至少k个质数;
首先写一个质数表
然后运用二分查找不断缩小l,直到找的最接近的;
代码实现:
#include<cstring>
#include<stdio.h>
#define maxn 1000000
int prime[maxn+11];
int a,b,k;
void table()//制作质数表,确定范围区间内的质数个数
{
int i,j;
memset(prime,0,sizeof(prime));
prime[0]=prime[1]=1;
for(i=2;i<=maxn;++i)
{
if(!prime[i])
{
for(j=i+i;j<=maxn;j+=i)
prime[j]=1;
}
}
prime[0]=prime[1]=0;
for(i=2;i<=maxn;++i)
{
if(prime[i])
prime[i]=0;
else
prime[i]=1;
prime[i]+=prime[i-1];
}
}
int judge(int mid)//判断区间长度质数个数是否满足条件
{
int i;
mid-=1;
for(i=a;i+mid<=b;++i)
{
if(prime[i+mid]-prime[i-1]<k)
return 0;
}
return 1;
}
int main()
{
table();//先打表
scanf("%d%d%d",&a,&b,&k);
int l=1,r=b-a+1,mid,ans;
if(prime[b]-prime[a-1]>=k)//先判断全部区间内质数个数是否满足
{
while(l<=r)
{
mid=(l+r)>>1;
if(judge(mid))
{
ans=mid;
r=mid-1;
}
else
l=mid+1;
}
printf("%d\n",ans);
}
else
printf("-1\n");
return 0;
}

浙公网安备 33010602011771号