HDU 寻找素数对

来源:互联网 发布:蒙古 欧洲 知乎 编辑:程序博客网 时间:2024/06/05 04:12

寻找素数对


Problem Description
哥德巴赫猜想大家都知道一点吧.我们现在不是想证明这个结论,而是想在程序语言内部能够表示的数集中,任意取出一个偶数,来寻找两个素数,使得其和等于该偶数.
做好了这件实事,就能说明这个猜想是成立的.
由于可以有不同的素数对来表示同一个偶数,所以专门要求所寻找的素数对是两个值最相近的.

Input
输入中是一些偶整数M(5<M<=10000).

Output
对于每个偶数,输出两个彼此最接近的素数,其和等于该偶数.

Sample Input
20 30 40

Sample Output
7 1313 1717 23
---------------------------
菜鸟篇:
/*方法是:寻找 n/2 两边的素数并且和为 n */#include<stdio.h>#include<math.h>int right(int n);int left(int n);int main(){int n,temp,res,t,d;int le,ri;while(scanf("%d",&n)!=EOF){t=n;n>>=1;le=n;ri=n;temp = left(le);res = right(ri);while(1){d = res + temp;if(d==t)break;else if(d>t){le-=2;temp = left(le);}else{ri+=2;res = right(ri);}}printf("%d %d\n",temp,res);}return 0;}int right(int n){int limit;int i,j,flag;if((n&1)==0)n+=1;for(j=n;;j+=2){limit = sqrt(j)+1;flag=1;for(i=2;i<=limit;i++){if(j%i==0){flag=0;break;}}if(flag)return j;}return n;}int left(int n){int limit;int i,j,flag;if((n&1)==0)n-=1;for(j=n;;j-=2){limit = sqrt(j)+1;flag=1;for(i=2;i<=limit;i++){if(j%i==0){flag=0;break;}}if(flag)return j;}return 0;}
------------------------------------------------
高效篇:
#include<stdio.h>int su(int x)                     //判断素数{    int i;    for(i = 2;i*i<=x;i++)        if(x%i==0&&x!=2)            return 0;    return 1;}int main(){    int n,i,a,b;    while(scanf("%d",&n)!=EOF)    {        for(i = 1;i<=n/2;i++)        if(su(i)&&su(n-i))          //一个比n/2大,一个比n/2小         {            a = i;            b = n-i;        }        printf("%d %d\n",a,b);    }    return 0;}
0 0