题目: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");
}
}
}