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]
>>> 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码力全开666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值