1.题目
我们可以编写一个函数,该函数遍历这个范围内的每个数字,并检查它是否是质数。在检查质数时,我们只需要检查到该数的平方根即可,
因为如果它有一个大于其平方根的因数,那么它也必定有一个小于或等于其平方根的因数。这可以显著减少不必要的计算。
2.第一次提交代码如下
双重循环超时,一个测试点答案错误
n = int(input())
count = 0
su = [2]
for i in range(3, n, 2):
for j in range(2, i):
if i % j == 0:
break
else:
su.append(i)
for i in range(1, len(su)):
if su[i] - su[i-1] == 2:
count += 1
print(count)
3.最终代码
n = int(input()) # 获取输入的正整数N
def isSu(num): # 编写一个判断是否是素数的函数
if num <= 1: # 如果传入的数小于等于1
return False # 不是素数(1也不是素数)
if num <= 3: # 如果输入的数小于等于3(到此为止相当于1<num<=3,因为上面已经判断完小于等于1的数了)
return True # 是素数(2,3)
# 这一步是优化的一部分,因为除了2和3之外,任何能被2或3整除的数都不可能是素数。这个步骤可以显著减少后续需要检查的数,从而提高算法的效率。
if num % 2 == 0 or num % 3 == 0:
return False
c = 5
while c <= num ** 0.5: # 检查到num的平方根即可(见上方红字)
# 检查当前数c(6k-1的形式)和c+2(6k+1的形式)是否是num的因子
if num % c == 0 or num % (c + 2) == 0:
return False # 如果找到因子,返回False
c += 6 # c增加6构成6k-1的形式
return True # 如果没找到因子,返回True
count = 0 # 定义一个count用于计数
for i in range(1, n-1): # 循环1到输入的数N之间的所有数([1到n-1)实际上是[1到n-2]闭区间,因为下面判断i+2了,所以需要防止下标越界)
if isSu(i) and isSu(i+2): # 同时判断i和i+2,也就是相邻且差为2的数是否为素数
count += 1 # 是的话count+1
print(count) # 输出数量