1007 素数对猜想 (20分)
让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N(<105),请计算不超过N的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N。
输出格式:
在一行中输出不超过N的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
素数(Prime number),又称作质数,是在大于1的自然数中,除了1和它本身以外,不再有其他因数的自然数。
代码:
#导入math库
#math库中包含了许多数学运算函数
import math
#输入数字并转换为整型
n=int(input())
#用来保存素数的列表
primelist=[]
#用来统计满足猜想的素数对个数
count=0
#函数用来判断是否为素数
def isprime(n):
#n为2或3,可以直接判断是素数
if n == 2 or n == 3:
return True
#n可以被2或3整除,可以直接判断不是素数
if n % 2 == 0 or n % 3 == 0:
return False
#观察素数的分布可以发现,除2&3以外的素数,必定分布在6k(k为大于1的整数)的两侧。
#6k%6==0
#(6k+2)%2==0
#(6k+3)%3==0
#(6k+4)%2==0
#所以2&3以外的素数为6k+1或6k-1的形式,据此可以缩小因子范围
for k in range(6, int(math.sqrt(n)) + 2, 6):
if n % (k - 1) == 0 or n % (k + 1) == 0:
return False
return True
for i in range(2,n+1):
#是素数则添加到素数列表中
if isprime(i):
primelist.append(i)
#扫描素数列表,判断满足猜想的素数对
for k in range(1,len(primelist)):
if primelist[k]-primelist[k-1]==2:
count=count+1
#输出满足猜想的素数对的数量
print(count)
注意:
在isprime函数中,如果采用如下代码,即使用暴力法判断素数,会产生超时问题,随着数字位数的增大,程序所用的时间明显增多。
超时代码:
n=int(input())
primelist=[]
flag=0
count=0
for i in range(2,n+1):
flag=1
for j in range(2,i):
if i%j==0:
flag=0
break
if flag==1:
primelist.append(i)
for k in range(1,len(primelist)):
if primelist[k]-primelist[k-1]==2:
count=count+1
print(count)
本文介绍了一种计算不超过给定正整数N的满足素数对猜想的素数对个数的方法。通过定义dn=pn+1−pn,其中pi是第i个素数,实现了一个高效判断素数的函数,并统计了满足条件的素数对数量。
1007 素数对猜想 20分&spm=1001.2101.3001.5002&articleId=107182333&d=1&t=3&u=fc17cac0ccc141e4aeff6cfb6633e4b8)
328

被折叠的 条评论
为什么被折叠?



