PAT乙級 1007 素數對猜想 20分

2021-10-04 12:25:14 字數 1967 閱讀 1244

讓我們定義d​n為:dn=p​n+1−pn,其中p​i是第i個素數。顯然有d1=1,且對於n>1有dn是偶數。「素數對猜想」認為「存在無窮多對相鄰且差為2的素數」。

現給定任意正整數n(<10​5 ),請計算不超過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的素數 現...