version1:
这里主要是素数的判断方法👇
在判断时仅遍历到根号下n,已经减少了一半计算量,但还不够!
import math
def isPrime(n):
if n <= 1:
return False
for i in range(2, int(math.sqrt(n)) + 1):
if n % i == 0:
return False
return True
N = eval(input())
n = 0
for i in range(3, N-1):
if isPrime(i) and isPrime(i + 2):
n += 1
print(n)
有一个测试点运行超时……
version2:
AC
素数高阶判别方法:除了2以外的所有偶数都不是素数,除了3以外能被3整除的都不是素数,以此类推地从列表中剔除这一类元素。大大减少素数判断次数。
初始化标志列表,其中各个元素值都置为1。
将上述规律中不是素数的标志均置为0。
将处理过程分为两部分:
①修改标志列表中的值
②移动“指针”p至下一个素数
n = int(input())
cnt = 0
flag = [1]*(n+2)#从数字0开始的标志列表
p = 2#最小的素数从2开始
result = []#用于存储素数
while p <=n:#flag数组设置最后一位flag[n+1]用于退出while循环
result.append(p)
for i in range(2*p, n+1, p):#过滤某一类非素数元素
flag[i] = 0
while 1:
p += 1
if flag[p] == 1:
break
temp = result[0]
for num in result[1:]:#统计相邻素数仅相差2的素数对个数
if num - temp == 2:
cnt += 1
temp = num
print(cnt)
version1不断循环使用素数判断函数是超时的问题所在。