python经典百题之打印素数

题目:找出1-N之间的所有素数,并输出所有素数.

素数又称质数,是指只能被1和自身整除的整数,即除了1和本身以外没有其他因数的正整数。例如,2、3、5、7、11等都是素数。任何大于1的正整数都可以由素数相乘得到,因此素数具有重要的数学意义。

方法一:暴力枚举法

def is_prime(n):
    if n < 2:
        return False
    for i in range(2, n):
        if n % i == 0:
            return False
    return True

def find_prime(n):
    prime_list = []
    for i in range(2, n):
        if is_prime(i):
            prime_list.append(i)
    return prime_list

优点:实现简单,容易理解。

缺点:时间复杂度较高,无法处理较大的素数范围。

方法二:优化枚举法

def find_prime(n):
    prime_list = []
    for i in range(2, n):
        j = 2
        while j <= int(i ** 0.5):
            if i % j == 0:
                break
            j += 1
        if j > int(i ** 0.5):
            prime_list.append(i)
    return prime_list

优点:减少了部分重复计算,时间复杂度有所降低。

缺点:仍然无法处理较大的素数范围。

方法三:埃氏筛法

def find_prime(n):
    prime_list = []
    is_prime = [True] * (n+1)
    for i in range(2, n+1):
        if is_prime[i]:
            prime_list.append(i)
            for j in range(i*i, n+1, i):
                is_prime[j] = False
    return prime_list

优点:时间复杂度较低,可以处理较大的素数范围。

缺点:空间复杂度较高,需要一个大小为(n+1)的数组来判断是否为素数。

方法四:欧拉筛法

def find_prime(n):
    prime_list = []
    is_prime = [True] * (n+1)
    for i in range(2, n+1):
        if is_prime[i]:
            prime_list.append(i)
        for j in range(len(prime_list)):
            if i * prime_list[j] > n:
                break
            is_prime[i * prime_list[j]] = False
            if i % prime_list[j] == 0:
                break
    return prime_list

优点:时间复杂度较低,空间复杂度较低。

缺点:实现较为复杂,需要对已知素数进行筛选。

猜你喜欢

转载自blog.csdn.net/yechuanhui/article/details/132852726
今日推荐