您的位置:首页 > Web前端

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

2016-04-09 21:18 423 查看
题目: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");
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: