让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N(<105),请计算不超过N的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N。
输出格式:
在一行中输出不超过N的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
解析:
输入n作为素数阈值,使寻找的素数不能超过其阈值,在阈值下的素数只要是相邻的且差值为二这就是一个“素数对猜想”的素数对。
解题:
# “素数对猜想”认为“存在无穷多对相邻且差为2的素数”
# 20 以内的素数:2,3,5,7,11,13,17,19
# 邻且差为2的素数:5-3=2,7-5=2,13-11=2,19-17=2 -> 有四对
# 判断 n 是否是素数
def is_ss(n):
for i in range(2, int(n ** 0.5 + 1)):
if n % i == 0:
return False
return True
# “素数对猜想”认为“存在无穷多对相邻且差为2的素数”
def ssdcx(n):
ss_list = list() # 储存素数的列表
ssdcx_number = 0 # 满足素数对猜想的素数对的个数
for i in range(2, n + 1): # 添加素数,素数不大于 n
if is_ss(i):
ss_list.append(i)
for j in range(len(ss_list) - 1): # 长度减一预防 indexError 下标越界错误
if ss_list[j + 1] - ss_list[j] == 2:
ssdcx_number += 1
return ssdcx_number # 返回满足猜想的素数对的个数
if __name__ == "__main__":
n = int(input())
l = ssdcx(n)
print(l)