求自然数n以内的全部素数(一般算法、埃氏筛法和欧拉筛法)

本文介绍了判断质数的几种算法,从基本的直接判断到常规优化算法,再到埃氏筛法和欧拉筛法,强调了算法的效率提升,如埃氏筛法的时间复杂度为O(nlog(logn)),而欧拉筛法的时间复杂度为O(n)。这些方法用于寻找大范围内的素数,例如10^8以内的素数。

    质数又称素数,指在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数。换句话说,只有两个正因数(1和自己)的自然数即为素数。比1大但不是素数的数称为合数。1和0既非素数也非合数。合数是由若干个质数相乘而得到的。

    质数的判断:

    1、只能被1和本身整除。

    2、不能被小于它的平方根的所有素数整除就是素数。

一、常规算法

    直接用定义做,判断n是否为素数,就用2~n-1去除n,如能被整除则不是素数,否则为素数。代码如下:

    求n以内的所有素数的时间复杂度:O(n²)

def isprime(n):
    for j in range(2, n):     # 2~n-1,不包括n
        if (n % j == 0):      # 能被2~n-1(不包括n)整除,不是素数
            return False
    else:
        return True           # 循环正常结束是素数(没有被整除)

P = []
for i in range(2, 10**8+1):   # 求10⁸以内的素数
    if isprime(i):
        P.append(i)

print(P)

二、常规优化算法

    上述算法中循环次数为2~n-1,共n-2次。因为因数是成对出现的,一个小于等于算术平方根,另外一个大于等于算术平方根。所以只需测试小于等于算术平方根的因数是否存在,如存在则不是素数,否则就是素数。代码如下:

    求n以内的所有素数的时间

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值