题意:输入一个偶数n,找出最接近的一对素数x,和y,使得x+y=n;
题解:题中n<=10000,而输入时输入到文本末。所以可以预处理数据,减少每次查询的时间。
先找出小于10000的所有素数。这个有模板,两个for解决。之后枚举下所有对素数,将差最小的对存在结构体数组里。查询的时候直接调用数组即可。
耗时:0MS
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL __int64
const int maxn=1e4+10;
int prime[maxn],t,vis[maxn];
struct node{
int a,b;
node(){a=0;b=10000;}
}e[maxn];
void init()
{
int i,j,k;
memset(vis,0,sizeof(vis));
t=0;
prime[t++]=1;
for(i=2;i<maxn;i++)//找出小于10000的所有素数。
{
if(!vis[i])
{
for(j=i*i;j<maxn;j+=i)
vis[j]=1;
prime[t++]=i;
}
}
for(i=0;i<t;i++)
{
for(j=i;j<t;j++)
{
int temp=prime[i]+prime[j];
if(temp>10000)break;
if(prime[j]-prime[i]<e[temp].b-e[temp].a)
{
e[temp].a=prime[i];
e[temp].b=prime[j];
}
}
}
}
int main()
{
init();
int n;
while(cin>>n)
{
cout<<e[n].a<<" "<<e[n].b<<endl;
}
return 0;
}