【PAT_Python解】1013 数素数

原题链接:PTA | 程序设计类实验辅助教学平台

参考资料:高效判断素数算法(6倍原理)_为什么说大于5的素数必然出现在6的倍数两侧-优快云博客

Tips:以下Python代码仅个人理解,非最优算法,仅供参考!

def is_prime(n):
    if n <= 3:
        return n >= 2
    else:
        #如果不与6的倍数相邻,肯定不是素数
        if n % 6 != 5 and n % 6 != 1:
            return False
    #对6倍邻数进行判断,是否为6倍邻数的倍数
    for i in range(5, int(n**0.5)+1, 6):
        if n % i == 0 or n % (i+2) == 0:
            return False
    return True
M,N=map(int,input().split())
count = 0
ls = []
for n in range(2,105000):   #最大取值Pn为10^4,第1w个素数是105000范围内
    if count >= N:
        break
    else:
        if is_prime(n):
            count+=1
            ls.append(n)
row = 0
for i in range(M-1,N):
    row+=1
    if row%10==0: #每10个一行
        print(ls[i],end='\n')
    elif i==N-1:    #循环结束的最后一个
        print(ls[i])
    else:   #正常输出带空格
        print(ls[i],end=' ')

#常规算法,测试点4素数10^4超时
# def is_prime(n):
#     if n < 2:
#         return False
#     for i in range(2,int(n**0.5)+1):
#         if n%i==0:
#             return False
#     return True

#以下miller rabin米勒-拉宾素性检验算法,测试点4素数10^4超时
# import random
 
# def miller_rabin(n, k=2): #K=1结果不准,K=2依然测试点4超时
#     if n == 2 or n == 3:
#         return True
#     if n % 2 == 0:
#         return False
 
#     r, s = 0, n - 1
#     while s % 2 == 0:
#         r += 1
#         s //= 2
 
#     for _ in range(k):
#         a = random.randint(2, n - 2)
#         x = pow(a, s, n)
#         if x == 1 or x == n - 1:
#             continue
 
#         for _ in range(r - 1):
#             x = pow(x, 2, n)
#             if x == n - 1:
#                 break
#         else:
#             return False
 
#     return True

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

新时代先锋

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

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

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

打赏作者

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

抵扣说明:

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

余额充值