PAT (Basic Level) Practice (中文)1007 素数对猜想 python

24 篇文章 0 订阅

出处:
https://pintia.cn/problem-sets/994805260223102976/problems/994805317546655744
1007 素数对猜想 (20 分)

这个题的主要思路是首先要找到不超过N的多有素数,然后计算它们当中相差为2的个数。
如何求素数,最简单的方法就是依次除以从2到比自己小1的数,只有其中有一个能整除,就说明它不是素数。
但这样的做法太暴力了,提交后会超时。
进行优化,第一步是除到根号N就可以了,为什么呢?因为假设存在一个大于根号N的数能被N整除,那它肯定要乘以一个小于根号N的数才能等于N。但是因为前面已经除过了,所以就不可能后边再有可以整除的了。
第二个可以优化的地方是,任何大于2的偶数都不是素数,所以我们考虑素数的时候就可以忽略它们。
参考:https://blog.csdn.net/xutiantian1412/article/details/78768833?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161954070716780357269468%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=161954070716780357269468&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-78768833.pc_search_result_before_js&utm_term=1007+素数对猜想+python
优化后的代码是这样的:

import math
def sushu(num):
    for i in range(3,int(math.sqrt(num)) + 1,2):
        if num % i == 0:
            return False
    return True
n = int(input())
sum = 0
f1 = sushu(3)
tmp = [3]
for i in range(3,n - 1,2):
    f2 = sushu(i + 2)
    if f1 and f2:
        sum += 1
    f1 = f2
print(sum)

但是这个代码还需要继续优化,因为它大概在超时和没超时的边缘,提交的时候有一定几率会报超时。
在这里插入图片描述
有时会通过:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值