python3之1007.素数对猜想 (20分)

不想你离开。 提交于 2019-12-06 23:31:17

题目赘述如下:

让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数。显然有 d1=1 且对于n>1有 dn 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。

现给定任意正整数N (< 10^5),请计算不超过N的满足猜想的素数对的个数。

输入格式:每个测试输入包含1个测试用例,给出正整数N。

输出格式:每个测试用例的输出占一行,不超过N的满足猜想的素数对的个数。

输入样例:

20

输出样例:

4

题目解析:

题目仍然是不难理解,也不难写,素数的判断是编程基本功,然后判断i和i+2是否是素数对。

本题争议最大的地方乃最后一个测试点,暴力求解往往超时,需要简要优化算法,如下代码测试最后一个测试点用时222ms,效果还不错,可堪重用。

import math

def sushu(num):     # 判断素数的函数,注意传入的num已经全是奇数了,故从3开始判断每个奇数是否是因数
    for i in range(3,int(math.sqrt(num))+1,2):
        if num % i == 0:
            return False
    return True

if __name__ == '__main__':
    n = int(input())
    con = 0                       # 素数对计数
    f1 = sushu(3)                 # f1和f2存入相邻两个数字的素数状态,如此可以避免下一次重复判断素数
    for i in range(3,n-1,2):      # 素数对最小为3,5;此处从3开始进行判断,并跳过偶数
        f2 = sushu(i+2)
        if f1 and f2:
            con+= 1
        f1 = f2

    print(con)


要点归纳:

主要是算法优化,一是将偶数过滤掉不进行处理,二是f1和f2的使用避免i+2在下一个循环中重复计算。

希望各位支持!不吝指教

PS:

时隔多时,据此文已有一年半,感谢几位阅读该文的盆友。在此再提出一个优化方法供盆友们尝试:

通过f1和f2,避免了待判断数字重复计算,其实在判断素数时还可优化。用一个list将遇到的素数依次存储,如[3, 5, ...](即小于n的所有奇数素数).

这样,在判断素数时,只需与该list中的素数进行相除即可。比如,判断11是不是素数时,只需与素数list中[3,5,7]比较,少了一个9,在数字较大时,一些非素数的奇数可以不用考虑(如9,15,25,...),性能可以得到较大提升,有兴趣的不妨试一下。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!