【Python】PAT-1007-素数对猜想
生活随笔
收集整理的這篇文章主要介紹了
【Python】PAT-1007-素数对猜想
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 題目描述
1007 素數對猜想 (20 分)
讓我們定義d**n為:d**n=p**n+1?p**n,其中p**i是第i個素數。顯然有d1=1,且對于n>1有d**n是偶數?!八財祵Σ孪搿闭J為“存在無窮多對相鄰且差為2的素數”。
現給定任意正整數N(<105),請計算不超過N的滿足猜想的素數對的個數。
輸入格式:
輸入在一行給出正整數N。
輸出格式:
在一行中輸出不超過N的滿足猜想的素數對的個數。
輸入樣例:
20輸出樣例:
42. 題目分析
素數定義:在大于1的自然數中,除了1和它本身以外不再有其他因數的自然數。
要求素數對,首先要求出<=N的全部素數,并把它放到一個list中。
所以自然而然想到要寫出一個算法,判斷一個數是否是素數
根據上面的流程,我們將其可以翻譯成代碼。
def isPrime(n):if n == 1:return Falseend = int(math.sqrt(n))for i in range(2, end+1):if n % i == 0:return Falsereturn True但是這樣寫算法的運行效率非常慢。
這一題,限制的總耗時是200ms。
雖然上面的代碼處理完全正確 , 但是最后一個測試點,直接運行超時,自然拿不到滿分。
所以我們要設計運算速度更快的判斷素數算法。
2,3,5,7,11,13,17,19,23觀察上面的數字,可以看出所有>6的素數,都可以采用 6k-1 或者 6k+1 的形式表示。(k>=1)
所以就設計出了算法2
def isprime(n):if n == 2 or n == 3:return Trueif n % 2 == 0 or n % 3 == 0:return Falsefor k in range(6,int(math.sqrt(n)) + 2, 6):# range取值 [6,12,18,...]if n % (k-1) == 0 or n % (k+1) == 0:return Falsereturn True3. AC代碼
import mathdef isPrime(n): # if n == 1: # return False # end = int(math.sqrt(n)) # for i in range(2, end+1): # if n % i == 0: # return False # return Trueif n == 2 or n == 3:return Trueif n % 2 == 0 or n % 3 == 0:return Falsefor k in range(6,int(math.sqrt(n)) + 2, 6):if n % (k-1) == 0 or n % (k+1) == 0:return Falsereturn Truen = int(input()) l = [i for i in range(2, n+1) if isPrime(i)]count = 0for index, element in enumerate(l):if index < len(l)-1:if l[index+1]-l[index] == 2:count += 1print(count) 與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的【Python】PAT-1007-素数对猜想的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【图文教程】Ubuntu softwar
- 下一篇: websocket python爬虫_p