1. 程式人生 > >PAT 素數對猜想 (Python)

PAT 素數對猜想 (Python)

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

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

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

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

輸入樣例:
20
輸出樣例:
4

Analysis:

1和0不是素數也不是合數,每個大於1的正整數都可以寫成素數的乘積

- 一般方法,整除2~sqrt(n) O(n*sqrt(n)),(m*n=p,m,n=mid或者m,n之中必定有一個值是小於mid的)

- 埃氏素數篩選,選取第一個未被處理的數,然後判斷是否是素數(m<sqrt(n)),如果是儲存,並將該數和能被該數整除的元素去掉,O(nloglogn),空間複雜度是O(n)

小於n的素數倒數和是loglogn

- 無重複篩選,線性篩選,O(n)

如果x與n互質,那麼n-x也與n互質

http://blog.csdn.net/zmazon/article/details/8290774

http://blog.csdn.net/nk_test/article/details/46242311

http://bbs.csdn.net/topics/340202337

http://wenku.baidu.com/link?url=KgTW4k4JLM5RfBy-n0MFdMJhhIRUXPzOP3Wo2rgIMjpDf5N0YKiEtQWjUDzysHoUBPC3vd0V7m9AQdxC01dTAqVWYHeHVtmqOFiUGpNl_e7

http://www.bubuko.com/infodetail-837565.html

Solution:
import math
def isPrime(n):
	m=int(math.sqrt(n))
	for i in range(2,m+1):
		if n%i==0:
			return False
	return True

def getPairNum(N):
	pnum,ls,tmp=0,[],0
	for i in range(2,N+1):
		if isPrime(i):
			ls.append(i)
			tmp+=1
			if tmp>1 and ls[tmp-1]-ls[tmp-2]==2:
				pnum+=1
	print pnum

input=int(raw_input())
getPairNum(input)