讓我們定義dn為:dn=pn+1−pn,其中pi是第i個素數。顯然有d1=1,且對於n>1有dn是偶數。「素數對猜想」認為「存在無窮多對相鄰且差為2的素數」。
現給定任意正整數n(<105 ),請計算不超過n的滿足猜想的素數對的個數。
輸入在一行給出正整數n。
在一行中輸出不超過n的滿足猜想的素數對的個數。
列舉出105以內的所有素數,對整個素數表依次進行判斷,找出符合條件的素數對。
素數是乙個非常深奧的話題,判斷素數和驗證素數的方法有普通素數篩法,埃氏篩法,尤拉篩法。
根據下面的統計資料可以看出,不同的篩選素數的方法在程式執行時間上有明顯的區別。
這個方法直接從0到根號n之間判斷這個數是不是素數,可以說是最好理解的一種方法了。這段**沒有借助額外的空間,因此,我們仔細觀察可以發現乙個問題,所有待驗證的數都驗證了兩邊,對時間不友好。(當n=10是,驗證了8和10. 當年12時,驗證了10和12,可見10被驗證了兩次)。
這個方法耗時基本在15毫秒左右。
#include
#include
using
namespace std;
const
int maxn =
110000
;int n,cnt;
vector<
int> primes;
void
getprimes()
}if(is_ok) primes.
push_back
(i);}}
intmain()
printf
("%d"
,cnt)
;return0;
}
優化過的樸素篩法
可以輕鬆跑進15毫秒
#include
#include
#include
using
namespace std;
const
int maxn =
110000
;vector<
int> prm;
int n,cnt,tmp=1;
void
get_primes()
}}intmain()
埃氏篩法o(nlogn) 也有說 o(nloglogn)
耗時5毫秒以內
#include
#include
#include
using
namespace std;
const
int maxn =
110000
;vector<
int> prm;
int n,cnt,tmp=1;
void
get_primes()
}}intmain()
尤拉篩法 o(n) 但是因為常數項比較高的原因,在小量資料範圍內和埃氏篩法耗時不相上下。
耗時5毫秒以內
通過這道題可以看出,不同演算法執行時間是有明顯差距的,每當我們提交完乙份**的時候,不僅要關心**有沒有通過所有測試點,在通過所有測試點的條件下,看看自己的**執行時間是不是也是優秀的,如果自己的**執行速度明顯比別人慢,那就要多看看部落格,多看看別人的**,自己想想還有沒有優化的空間,選擇一種最快的演算法完成這道題。
PAT 乙級 1007 素數猜想對
題目描述 讓我們定義 dn 為 dn pn 1 pn,其中 pi 是第i個素數。顯然有 d1 1 且對於n 1有 dn 是偶數。素數對猜想 認為 存在無窮多對相鄰且差為2的素數 現給定任意正整數n 105 請計算不超過n的滿足猜想的素數對的個數。輸入格式 每個測試輸入包含1個測試用例,給出正整數n。...
PAT乙級1007 素數對猜想
時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 chen,yue 讓我們定義 dn 為 dn pn 1 pn,其中 pi 是第i個素數。顯然有 d1 1 且對於n 1有 dn 是偶數。素數對猜想 認為 存在無窮多對相鄰且差為2的素數 現...
PAT 乙級 1007 素數對猜想
時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 chen,yue 讓我們定義 dn 為 dn pn 1 pn,其中 pi 是第i個素數。顯然有 d1 1 且對於n 1有 dn 是偶數。素數對猜想 認為 存在無窮多對相鄰且差為2的素數 現...