PAT(乙级)素数对猜想python

题目

“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。现给定任意正整数N(<10**​5
​​ ),请计算不超过N的满足猜想的素数对的个数。

输入格式:

输入在一行给出正整数N。

输出格式:

在一行中输出不超过N的满足猜想的素数对的个数。

输入样例:

20

输出样例:

4

代码:

import math
n=int(input())
def panduan(n):
    flag=True
    if (n==1)|(n==2):
        flag=True
    else:
        for i in range(3,int(math.sqrt(n))+1,2):
            if n % i==0:
                flag=False
    return flag

def sulist(n):
    slist=[1,2]
    for i in range(3,n+1,2):
        if panduan(i):
            slist.append(i)
    return slist

def duinum(x):
    count=0
    for i in range(len(x)-1):
        if x[i+1]-x[i]==2:
            count+=1
    return count    

print(duinum(sulist(n)))

解题思路:
1.先写一个函数判断这个数是否为素数。
2.在利用一个循环遍历,将1~N中间的质数均存在一个列表里slist
3.在写一个for循环来判断相邻两个质数之间的差是否为2,输出对数。

这个代码运行也正确,但是运行会超时。

方法二:

n=int(input())
def prime(n):
    slist=[1]
    flag = [1]*(n+2)
    p=2
    while(p<=n):
        slist.append(p)
        for i in range(2*p,n+1,p):
            flag[i] = 0
        while 1:
            p += 1
            if(flag[p]==1):
                break
    return slist

def duinum(x):
    count=0
    for i in range(len(x)-1):
        if x[i+1]-x[i]==2:
            count+=1
    return count    

print(duinum(prime(n)))

这个方法好,因为以2*P开始,至N遍历结束,所以这个序列的第N+1位置很可能是0,所以要有n+2个[1]来跳出循环。这个判断素数的方法大大提高了运算速度。

知识点一:求根号n

>>> import math
>>> math.sqrt(4)
2.0
>>> 

知识点二:一个整数乘以一个列表并不是各个元素相乘

>>> [1,2,3,4]*2
[1, 2, 3, 4, 1, 2, 3, 4]
>>> 
上一篇:Delphi OleVariant 取值/赋值操作


下一篇:LeetCode-345-反转字符串中的元音字母