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

出处:
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)

但是这个代码还需要继续优化,因为它大概在超时和没超时的边缘,提交的时候有一定几率会报超时。
PAT (Basic Level) Practice (中文)1007 素数对猜想 python_第1张图片
有时会通过:
PAT (Basic Level) Practice (中文)1007 素数对猜想 python_第2张图片

你可能感兴趣的:(PAT,python,python)