HDU1262:寻找素数对

来源:互联网 发布:第戎高等商学院 知乎 编辑:程序博客网 时间:2024/06/06 01:15

Description

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

Input

输入中是一些偶整数 M(大于5小于等于10000)

Output

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

Sample Input

20 30 40

Sample Output

7 13
13 17
17 23

代码与解释:

#include<iostream>#include<cstdio>using namespace std;int p[10000] = {0};int tag[10000] = {0};void FindPrime(int a){     int cnt = 0,i;    for (int i = 2; i < a; i++)     {        if (!tag[i])       //tag是标记数组,初始化为0                    p[cnt++] = i;    //将数i加入素数数组        for (int j = 0; j < cnt && p[j] * i < a; j++)         {             tag[i*p[j]] = 1;            if (i % p[j] == 0)              break;         }    } }void FindResult(int a){    int i,j,num = 0,flag = 0,num1,num2;    for(i = 0; i < 10000; i++){        if(p[i]){            num++;        }    }    for(i = 0; i < num; i++){        for(j = i; j < num; j++){            if((p[i] + p[j]) == a){                if(flag){                    if(p[i] > num1){                        num1 = p[i];                    }                    if(p[j] < num2){                        num2 = p[j];                    }                }                else                {                    num1 = p[i];                    num2 = p[j];                    flag = 1;                }            }        }    }    cout << num1 << " " << num2 << endl;}int main(){    int m;    while(cin >> m){        FindPrime(m);        /*for(int i=0;p[i]!=0;i++){            cout << p[i] << "  ";        }*/        FindResult(m);    }    return 0;}

以上代码经Vjudge判定通过

原创粉丝点击