很尴尬,忘了什么是素数了
质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数
一、题目
二、代码
思想:
这个题目本身不难,难的是对题目的优化
需要知道素数的定义,知道和奇数的区别
对代码的优化解决掉超时的问题,优化可以从以下考虑
- 将除了 2 的偶数自动过滤,不参加运算
- 将每次符合要求的数加入列表,后面的数字只需要和列表中的数进行比较即可,看看是否是素数
然而,结果很残酷,总是最后一个超时运算,观察大佬的代码,大概意思就是,合乎要求的数中除了 2 和 3 之外,其余的数都与6的倍数想差1
比如 :[2,3,5,7,11,13,17,19]
但是,不好理解,也不好编写代码,所以先记录下,希望有后续把
后续来了,另外一种思路是一旦一个数符合要求,那么他的倍数将不符合要求,比如2符合则,4,6,8等不符合要求,3符合要求则 6,9,12等不符合要求
因此思路是建立一个N+2 的列表(加2是因为从2开始判断到N结束,所以长度加2)值均为1,找到一个素数后,然后将N以内的该素数的倍数相应位置为0
N = int(input())
n = 0
num = []
for i in range(2,N+1):
flag = 1
if i == 2 or i%2 !=0:
for j in num:
if i%j ==0:
flag = 0
break
else: flag = 0
if flag:
num.append(i)
j = 0
while j<len(num)-1:
if num[j+1] - num[j] == 2:
n +=1
j +=1
print(n)
改进代码:
def test(n,data):
flag = [1]*(n+2)
p=2
while p<=n:
data.append(p)
# 将该素数的倍数对应的列表位置为 0
for i in range(2*p,n+1,p):
flag[i] = 0
# 跳过素数的倍数
while True:
p +=1
if(flag[p]==1):
break
N = int(input())
data = []
test(N,data)
num = 0
for i in range(len(data)-1):
if(data[i+1]-data[i]==2):
num +=1
print(num)