您的位置:首页 > 其它

hdu 1262 寻找素数对

2013-09-25 15:03 281 查看
题意:输入一个偶数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
.a<<" "<<e
.b<<endl;
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: