杭电 1262 寻找素数对 【素数】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1262

解题思路:先将题目中给出的偶数范围内的素数打表,设输入的那个偶数为n,这样找到n/2在素数表的位置k,从pn[k]到pn[2];以及从pn[k]到pn[10000]依次判断相加是否等于n即可。

反思:注意像 10和26这样的偶数,应该输出的是 5 5;13 13;所以应该单独处理这种n/2等于一个素数的偶数

ps:这是在杭电的100题,这三个多月来,加油!!!!!fighting!!!!!!

#include <stdio.h>
#include <math.h>
#define N 10000
 int p[N];   //判断p[i]中的i是否为素数
int pn[N];   //存储素数

void prim_num()
{
    int i,j,n;
    for(i=1; i<=N; i++)
        p[i]=1;
    n=(int)sqrt(N);
    for(i=2; i<=n; i++)
    {
        for(j=i+i; j<=N; j+=i)   //素数的合肯定不是素数,这就是判断哪些数不是素数
        {
            p[j]=0;
        }
    }
    j=1;
    for(i=1; i<=N; i++)  //把素数存储入pn[N],下表从1开始
    {
        if(p[i])
        {
            pn[j++]=i;
        }
    }
}

int main()
{
    int i,j,k;
    int n;
    prim_num();
    while(scanf("%d",&n)!=EOF)
    {
        int flag=1;
        for(i=2;i<N;i++)
        {
            if(n/2==pn[i])
            {
                k=i;
                break;
            }
            if(n/2>pn[i]&&n/2<pn[i+1])
            {
                k=i;
                break;
            }

        }
        for(i=k;i>=0&&flag;i--)
        {
            for(j=i;j<N;j++)
            {
                if(pn[i]+pn[j]==n)
                {
                    printf("%d %d\n",pn[i],pn[j]);
                    flag=0;

                }
            }
        }
    }
    return 0;
}

  

posted @ 2014-11-23 06:46  sequenceaa  阅读(284)  评论(0编辑  收藏  举报