“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。现给定任意正整数N(<10**5
),请计算不超过N的满足猜想的素数对的个数。
输入在一行给出正整数N。
在一行中输出不超过N的满足猜想的素数对的个数。
20
4
代码:
import math n=int(input()) def panduan(n): flag=True if (n==1)|(n==2): flag=True else: for i in range(3,int(math.sqrt(n))+1,2): if n % i==0: flag=False return flag def sulist(n): slist=[1,2] for i in range(3,n+1,2): if panduan(i): slist.append(i) return slist def duinum(x): count=0 for i in range(len(x)-1): if x[i+1]-x[i]==2: count+=1 return count print(duinum(sulist(n)))
解题思路:
1.先写一个函数判断这个数是否为素数。
2.在利用一个循环遍历,将1~N中间的质数均存在一个列表里slist
3.在写一个for循环来判断相邻两个质数之间的差是否为2,输出对数。
这个代码运行也正确,但是运行会超时。
方法二:
n=int(input()) def prime(n): slist=[1] flag = [1]*(n+2) p=2 while(p<=n): slist.append(p) for i in range(2*p,n+1,p): flag[i] = 0 while 1: p += 1 if(flag[p]==1): break return slist def duinum(x): count=0 for i in range(len(x)-1): if x[i+1]-x[i]==2: count+=1 return count print(duinum(prime(n)))
这个方法好,因为以2*P开始,至N遍历结束,所以这个序列的第N+1位置很可能是0,所以要有n+2个[1]来跳出循环。这个判断素数的方法大大提高了运算速度。
>>> import math >>> math.sqrt(4) 2.0 >>>
>>> [1,2,3,4]*2 [1, 2, 3, 4, 1, 2, 3, 4] >>>