Python:1007 素数对猜想

守給你的承諾、 提交于 2019-12-06 23:33:43

很尴尬,忘了什么是素数了

质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数

一、题目

在这里插入图片描述

二、代码

思想
这个题目本身不难,难的是对题目的优化

需要知道素数的定义,知道和奇数的区别

对代码的优化解决掉超时的问题,优化可以从以下考虑

  1. 将除了 2 的偶数自动过滤,不参加运算
  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)

在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!