HDU 4715 Difference Between Primes (筛法求素数)

来源:互联网 发布:网络直播行业前景 编辑:程序博客网 时间:2024/05/22 02:06

题目:http://acm.hrbust.edu.cn/vj/index.php?c=problem-problem&id=475650

代码:

#include<stdio.h>#include<string.h>using namespace std;int ans;int prime[1050000],pans,p[1050000];int re;int n;int init(){    memset(prime,0,sizeof(prime));    prime[0]=prime[1]=1;    for(int i=2;i<=1000000;i++)    {        if(!prime[i])        {            for(int j=i+i;j<=1000000;j+=i)            {                prime[j]=1;            }        }    }    pans=0;    for(int i=2;i<=1000000;i++)    {        if(prime[i]==0)            p[pans++]=i;    }    return 1;}int main(){    init();    int tcase,i;    scanf("%d",&tcase);    bool flag=true;    while(tcase--)    {        scanf("%d",&n);        flag=true;        for(int i=0;i<pans;i++)        {            if(p[i]>=n&&prime[p[i]-n]==0)            {                printf("%d %d\n",p[i],p[i]-n);                flag=false;                break;            }        }        if(flag)            printf("FAIL\n");    }}



今天又作了一遍,一直WRONG,找题解才知道题意是

给出一个偶数(不论正负),求出两个素数a,b,能够满足 a-b=x,素数在1e6以内。

代码是

#include<stdio.h>#include<string.h>using namespace std;int prim[1000000];int book[1000000];int temp=0;int main(){    memset(prim,0,sizeof(prim));    prim[0]=1,prim[1]=1;    for(int i=2; i<=1000000; i++)    {        if(prim[i]==0)        {            book[temp++]=i;            for(int j=i+i; j<=1000000; j=j+i)            {                prim[j]=1;            }        }    }    int t;    scanf("%d",&t);    while(t--)    {        int n;        scanf("%d",&n);        int k=1;        if(n<0)        {            k=0;            n=-n;                                           //瞎蒙也能过,        }        int flag=1;                                         //必须将n边为正数        for(int i=0; i<=1000000; i++)        {            if(prim[i]==0&&prim[i+n]==0)            {                if(k==1)                {                    printf("%d %d\n",i+n,i);                }                else                {                    printf("%d %d\n",i,i+n);                  //细思极恐。                }                flag=0;                break;            }        }        if(flag==1)        {            printf("FALL\n");        }    }}

还以为会超时,竟然A了。


这回应该明白了。

#include<stdio.h>#include<string.h>using namespace std;int prim[1000000];int book[1000000];int temp=0;int main(){    memset(prim,0,sizeof(prim));    prim[0]=1,prim[1]=1;    for(int i=2; i<=1000000; i++)    {        if(prim[i]==0)        {            for(int j=i+i; j<=1000000; j=j+i)            {                prim[j]=1;            }        }    }    int t;    scanf("%d",&t);    while(t--)    {        int n;        scanf("%d",&n);        int k=1;        if(n<0)        {            k=0;            n=-n;        }        int flag=1;        for(int i=0; i<=1000000; i++)        {            if(k==1)            {                if(prim[i]==0&&prim[i+n]==0)                {                    printf("%d %d\n",i+n,i);                    flag=0;                    break;                }            }            else if(k==0)            {                if(prim[i]==0&&prim[i+n]==0)                {                    printf("%d %d\n",i,i+n);                    flag=0;                    break;                }            }        }        if(flag==1)        {            printf("FAIL\n");        }    }}


0 0
原创粉丝点击