題目贅述如下:
讓我們定義 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。輸出格式 ...