ACM-簡單題之尋找素數對——hdu1262
阿新 • • 發佈:2019-02-15
尋找素數對
題目: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
題目: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; }