1. 程式人生 > >python3之1007.素數對猜想 (20分)

python3之1007.素數對猜想 (20分)

題目贅述如下:

讓我們定義 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在下一個迴圈中重複計算。

希望各位支援!不吝指教