python3之1007 素數對猜想 20分

2021-08-13 08:40:23 字數 1437 閱讀 5981

題目贅述如下:

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

現給定任意正整數n (< 10^5),請計算不超過n的滿足猜想的素數對的個數。

輸入格式:每個測試輸入包含1個測試用例,給出正整數n。

輸出格式:每個測試用例的輸出佔一行,不超過n的滿足猜想的素數對的個數。

輸入樣例:

20
輸出樣例:

4
題目解析:

題目仍然是不難理解,也不難寫,素數的判斷是程式設計基本功,然後判斷i和i+2是否是素數對。

本題爭議最大的地方乃最後乙個測試點,暴力求解往往超時,需要簡要優化演算法,如下**測試最後乙個測試點用時222ms,效果還不錯,可堪重用。

import math

def sushu(num): # 判斷素數的函式,注意傳入的num已經全是奇數了,故從3開始判斷每個奇數是否是因數

for i in range(3,int(math.sqrt(num))+1,2):

if num % i == 0:

return false

return true

if __name__ == '__main__':

n = int(input())

con = 0 # 素數對計數

f1 = sushu(3) # f1和f2存入相鄰兩個數字的素數狀態,如此可以避免下一次重複判斷素數

for i in range(3,n-1,2): # 素數對最小為3,5;此處從3開始進行判斷,並跳過偶數

f2 = sushu(i+2)

if f1 and f2:

con+= 1

f1 = f2

print(con)

要點歸納:

主要是演算法優化,一是將偶數過濾掉不進行處理,二是f1和f2的使用避免i+2在下乙個迴圈中重複計算。

希望各位支援!不吝指教

ps:

通過f1和f2,避免了待判斷數字重複計算,其實在判斷素數時還可優化。用乙個list將遇到的素數依次儲存,如[3, 5, ...](即小於n的所有奇數素數).

這樣,在判斷素數時,只需與該list中的素數進行相除即可。比如,判斷11是不是素數時,只需與素數list中[3,5,7]比較,少了乙個9,在數字較大時,一些非素數的奇數可以不用考慮(如9,15,25,...),效能可以得到較大提公升,有興趣的不妨試一下。

素數對猜想之python3實現

題目 讓我們定義d n 為 d n p n 1 p n 其中p i 是第i個素數。顯然有d 1 1,且對於n 1有d n 是偶數。素數對猜想 認為 存在無窮多對相鄰且差為2的素數 現給定任意正整數n 請計算不超過n的滿足猜想的素數對的個數。輸入在一行給出正整數n。在一行中輸出不超過n的滿足猜想的素數...

1007 素數對猜想(python)

1007 素數對猜想 20分 讓我們定義d n 為 d n p n 1 p n 其中p i 是第i個素數。顯然有d 1 1,且對於n 1有d n 是偶數。素數對猜想 認為 存在無窮多對相鄰且差為2的素數 現給定任意正整數n 10 5 請計算不超過n的滿足猜想的素數對的個數。輸入格式 輸入在一行給出正...

1007素數對猜想

讓我們定義 dn 為 dn pn 1 pn,其中 pi 是第i個素數。顯然有 d1 1 且對於n 1有 dn 是偶數。素數對猜想 認為 存在無窮多對相鄰且差為2的素數 現給定任意正整數n 105 請計算不超過n的滿足猜想的素數對的個數。輸入格式 每個測試輸入包含1個測試用例,給出正整數n。輸出格式 ...