SPOJ Prime发电机错误答案

时间:2017-07-28 08:58:41

标签: primes sieve-of-eratosthenes

以下是问题的链接 - :http://www.spoj.com/problems/PRIME1/。 问题要求找到给定范围之间的所有素数 1 <= m <= n <= 1000000000n-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=2a=126。 所以,126+(2*k)都是复合的,其中k> = 0。 i=3,5,7.....

也是如此

当我在SPOJ上提交时,它给了我WA。 我使用了包含一些测试用例的spoj工具包。我将它与其他代码进行了比较并获得了相同的结果。 我错过了什么?

0 个答案:

没有答案