题目
“素数对猜想”认为“存在无穷多对相邻且差为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]来跳出循环。这个判断素数的方法大大提高了运算速度。
知识点一:求根号n
>>> import math
>>> math.sqrt(4)
2.0
>>>
知识点二:一个整数乘以一个列表并不是各个元素相乘
>>> [1,2,3,4]*2
[1, 2, 3, 4, 1, 2, 3, 4]
>>>