这是问题的链接 - :http://www.spoj.com/problems/PRIME1/ . 该问题要求在给定的范围 1 <= m <= n <= 1000000000n-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工具包 . 我将它与其他代码进行了比较并获得了相同的结果 . 我错过了什么?