以下是问题的链接 - :http://www.spoj.com/problems/PRIME1/。
问题要求找到给定范围之间的所有素数
1 <= m <= n <= 1000000000
,n-m<=100000
。
我已经实施了分段筛
这是逻辑 - :
由于问题的最大值为10 ^ 9,所以我会找到所有带有square_root(10 ^ 9)的素数,大约是31622.
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
void Prime1(long int low, long int high, bool* pre)
{
bool prime[high-low+1]={0};
if(low==high)
{if(pre[low]==0)printf("%ld\n", low);return;}
int t=sqrt(high);
for(long int i=2;i<=t;i++)
{
if(pre[i]==1)continue;
long int a=ceil(((double)low/i))*i;// start value
long int b=floor(((double)high/i))*i;// end value
if(a==1)
continue;
if(a==i)
a+=i;
if(a==0)
a=2*i;
for(long int x=a;x<=high;x+=i)
{
prime[x-low]=1;
}
}
if(low==1)
prime[0]=1;
else if(low==0)
prime[0]=prime[1]=1;
for(int i=0;i<=(high-low);i++)
if(!prime[i])printf("%ld\n", i+low);
}
int main()
{
bool pre[32001];
pre[0]=pre[1]=1;
int x=sqrt(32001);
for(int i=2;i<=x;i++)
{
if(pre[i]==0)
{
for(int j=i;i*j<=32000;j++)
{
pre[i*j]=1;
}
}
}
int t;
scanf("%d",&t);
long low, high;
while(t--)
{
scanf("%ld %ld",&low, &high);
printf("\n")
Prime1(low, high, pre);
}
}
现在我将从i = 2开始,找到m和n之间的倍数。这里m和n分别代表低和高。
我会继续增加我直到i<=sqrt(n)
例如,m = 125且n = 140
A =((双)M / I)* I。我会考虑它的上限值。
那么,m=125
i=2
时
a=126
。
所以,126+(2*k)
都是复合的,其中k> = 0。
i=3,5,7.....
当我在SPOJ上提交时,它给了我WA。 我使用了包含一些测试用例的spoj工具包。我将它与其他代码进行了比较并获得了相同的结果。 我错过了什么?