python3之1007.素數對猜想 (20分)
阿新 • • 發佈:2019-02-16
題目贅述如下:
讓我們定義 dn 為:dn = pn+1 - pn,其中 pi 是第i個素數。顯然有 d1=1 且對於n>1有 dn 是偶數。“素數對猜想”認為“存在無窮多對相鄰且差為2的素數”。
現給定任意正整數N (< 105),請計算不超過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在下一個迴圈中重複計算。
希望各位支援!不吝指教