自测-2 素数对猜想

文章预览:

题目

在这里插入图片描述

算法

本题用python写不能用一般的算法去求会超时,应该采用欧拉素数筛选法去求,算法复杂度为O(n)比其他的算法优秀的多,
算法思想:
(1)我们安排一个数组或者列表表示某个数是否为素数,最开始假设所有数都是素数
(2)核心思想是用最小质因数去筛选,我们另设一个列表,这个列表是用来存放已经筛选号的素数的,之后我们去遍历元素从2一直到n这些数,当这些数的标志是素数时纳入素数表中,无论他是与不是素数都与前面已经加入的素数去乘积,将这些乘积标志为非负数,但要注意不是一直与前面所有的素数相乘,而是要判断何时不要继续了,别忘了前面说过用最小质因子去筛选,避免重复所以当这个数i已经有了前面素数的因子时就不能再继续了,如果再继续就可能会造成重复,算法不是最优的了,例如 我们已经纳入素数表的 2,3,5, 现在是6这个数 6和2组合能帮助排除12,但不能去排除18 原因就是2是12的最小因子,但是18 3是最小因子,所以也就是说到6%2==0的时候就不能继续下去了。
代码如下:

def prime_list(n):
    a=(100001)*[0]
    b=(n+1)*[None]
    count=0
    for i in range(2,n+1):
        if a[i]==0:
            b[count]=i
            count+=1
        j=0
        while(j<count and i*b[j]<=n):
            a[i*b[j]]=1
            if(i%b[j]==0):
                break
            j+=1
    geshu=0
    for i in range(0,count-1):
        if b[i+1]-b[i]==2:
            geshu+=1
    print(geshu)   

a=int(input())
prime_list(a)
        
    
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值