HDU1262-寻找素数对

来源:互联网 发布:用户画像的数据来源 编辑:程序博客网 时间:2024/06/09 22:25

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 13923 Accepted Submission(s): 7024

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

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

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

Sample Input
20 30 40

Sample Output
7 13
13 17
17 23

刚开始未通过代码:

#include<stdio.h>#include<stdbool.h>//bool定义所需头文件 #define max 10000int arr[max+1];void Erat(int arr[max],int n){    int i,j;    bool flag1=true;    bool flag2=false;    arr[1]=flag2;    for(i=2;i<=n;i++)    {        arr[i]=flag1;    }    for(i=2;i<=n;i++)    {        if(arr[i]==flag1)        {            for(j=i*i;j<=n;j+=i)            {                arr[j]=flag2;            }        }    }} int main(){    int i,sum,count,j,min,diff;    Erat(arr,max);    while(scanf("%d",&sum)&&sum)    {        count=0;        j=0;        min=max;        for(i=0;i<sum/2;i++)        {            if(arr[i]&&arr[sum-i])            {                if(i!=sum-i)                {                    diff=sum-2*i;                    if(diff<min)                    {                        min=diff;                        j=i;                    }                }            }        }        printf("%d %d\n",j,sum-j);    }    return 0;}

oj评测显示:
这里写图片描述
问题主要是:判断素数花费时间过度

100分C语言代码:

#include<stdio.h>#include<math.h>int f(int n)//判断是否为素数{    int temp,i;    if(n==3) return 1;    temp=n%6;    if(temp!=1&&temp!=5)    return 0;    temp=sqrt(n);    for(i=3;i<=temp;i+=2)        if(n%i==0)            return 0;    return 1;}int main()//只要测试这两个奇数都是素数,就得到了差距最小的两个素数,输出即可{    int m,p;    while(scanf("%d",&m)!=EOF)    {        p=m/2;        if(p%2==0) p--;        while(1)        {            if(p<=2) break;            if(!f(p))            {                p=p-2;                continue;            }            if(f(m-p))            {                printf("%d %d\n",p,m-p);                break;            }            p-=2;        }    }    return 0;}