HDU1262:寻找素数对

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

Input

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

Output

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

Sample Input

20 30 40

Sample Output

7 13
13 17
17 23

代码与解释:

#include
#include
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判定通过