1. 程式人生 > >ACM-簡單題之尋找素數對——hdu1262

ACM-簡單題之尋找素數對——hdu1262

尋找素數對
題目:http://acm.hdu.edu.cn/showproblem.php?pid=1262
Problem Description
哥德巴赫猜想大家都知道一點吧.我們現在不是想證明這個結論,而是想在程式語言內部能夠表示的數集中,任意取出一個偶數,來尋找兩個素數,使得其和等於該偶數.
做好了這件實事,就能說明這個猜想是成立的.
由於可以有不同的素數對來表示同一個偶數,所以專門要求所尋找的素數對是兩個值最相近的.

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

Output
對於每個偶數,輸出兩個彼此最接近的素數,其和等於該偶數.

Sample Input
20 30 40

Sample Output

7 13
13 17

17 23

做了一通DFS、BFS休息會,剛好看到書上有關於素數的,做一下。

中文題目,不解釋。

搜尋從m/2開始搜尋,小的放前面。

#include <iostream>
#include <string.h>
using namespace std;
bool prim[100001];

/*
// 素性測試O(n^0.5)
bool is_prim(int n)
{
    int i;
    for(i=2; i*i<=n; ++i)
        if(n%i==0)  return false;
    return n!=1;
}
*/

// 埃氏篩法
void make_prim(int n)
{
    memset(prim,0,sizeof(prim));
    int i,j;
    prim[0]=prim[1]=1;
    for(i=2;i<=n;++i)
    {
        if(prim[i]) continue;
        for(j=i+i;j<=n;j+=i)
            prim[j]=1;
    }
}

int main()
{
    int m,a,b;
    make_prim(10000);
    while(cin>>m)
    {
        for(a=m/2;a<m;--a)
        {
            b=m-a;
            if(!prim[a] && !prim[b])    break;
        }
        cout<<a<<" "<<b<<endl;
    }
    return 0;
}