B1007 素数对猜想(python)

在这里插入图片描述
version1:
这里主要是素数的判断方法👇
在判断时仅遍历到根号下n,已经减少了一半计算量,但还不够!

import math
def isPrime(n):
    if n <= 1:
        return False
    for i in range(2, int(math.sqrt(n)) + 1):
        if n % i == 0:
            return False
    return True

N = eval(input())
n = 0
for i in range(3, N-1):
    if isPrime(i) and isPrime(i + 2):
        n += 1

print(n)

有一个测试点运行超时……

version2:
AC
素数高阶判别方法:除了2以外的所有偶数都不是素数,除了3以外能被3整除的都不是素数,以此类推地从列表中剔除这一类元素。大大减少素数判断次数。
初始化标志列表,其中各个元素值都置为1。
将上述规律中不是素数的标志均置为0。

将处理过程分为两部分:
①修改标志列表中的值
②移动“指针”p至下一个素数

n = int(input())
cnt = 0
flag = [1]*(n+2)#从数字0开始的标志列表
p = 2#最小的素数从2开始
result = []#用于存储素数
while p <=n:#flag数组设置最后一位flag[n+1]用于退出while循环
    result.append(p)
    for i in range(2*p, n+1, p):#过滤某一类非素数元素
        flag[i] = 0
    while 1:
        p += 1
        if flag[p] == 1:
            break
temp = result[0]
for num in result[1:]:#统计相邻素数仅相差2的素数对个数
    if num - temp == 2:
        cnt += 1
    temp = num
print(cnt)

version1不断循环使用素数判断函数是超时的问题所在。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值