这是问题的链接 - :http://www.spoj.com/problems/PRIME1/ . 该问题要求在给定的范围 1 <= m <= n <= 1000000000
, n-m<=100000
之间找到所有素数 . 我已经实现了Segmented Sieve这里是逻辑 - :因为问题的最大值为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<=sqrt(n)
例如,m = 125并且n = 140 a =((double)m / i)* i . 我会考虑它的上限 Value . 所以,当 m=125
i=2
a=126
. 所以, 126+(2*k)
都是复合的,其中k> = 0 . i=3,5,7.....
也一样
当我在SPOJ上提交时,它给了我WA . 我使用了包含一些测试用例的spoj工具包 . 我将它与其他代码进行了比较并获得了相同的结果 . 我错过了什么?