Python:1007 素数对猜想

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

质数是指在大于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)

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南淮北安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值