您的位置:首页 > 编程语言 > Python开发

PAT 素数对猜想 (Python)

2015-06-29 00:32 716 查看
让我们定义 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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: