本题目很简单 求区间 [a,b)内的素数 并且求距离最近和最远的两个数,但是唯一的难点在于 a,b可能很大。
先参考了书上的模板写了一下。。wa了 网上看了看大牛的博客,改变了一下思路。
首先 思路不变 既然数组存不下全部 [2,b) 那么我们另开一个数组存 [a,b];
找出 距离 a,b最近的素数 (当然还是得把 [2,sqrt(b))之间的素数筛一下 存一下);
void init()
{
int i,j,k,m;
t=0;
m=(int)sqrt(maxn+0.5);
memset(vis,0,sizeof(vis));//初始化
for(i=2;i<=m;i++)
{
if(!vis[i])
{
for(j=i*i;j<maxn;j+=i)//筛选素数
vis[j]=1;
}
}
for(i=2;i<maxn;i++)
if(!vis[i])
prime[t++]=i;//记录下来
}
之后就是开始对 ab区间内进行筛数
for(i=0;i<t;i++)
{
//测出倍数差
a=(a-1)/prime[i]+1;
b=b/prime[i];
//找到最近点 开始筛数
for(j=a;j<=b;j++)
if(j>1)
f[j*prime[i]-l]=1;
}
最后 f 数组就是我们[a,b)区间的素数筛了。