python习题-筛法求素数

该程序实现了一个名为`sieve`的函数,通过埃拉托斯特尼筛法找出介于n和m之间的所有素数。它首先初始化一个布尔列表,然后标记并排除掉每个质数的倍数,最后返回未被标记的数字(即素数)。程序还包含输入验证,确保n和m满足1<n<m<1000的条件。
摘要由CSDN通过智能技术生成

题目描述

用户输入整数n和m(1<n<m<1000),应用筛法求[n,m]范围内的所有素数。

【基本思想】

用筛法求素数的基本思想是:把从2到N的一组正整数从小到大按顺序排列。从中依次删除2的倍数、3的倍数、5的倍数,直到根号N的倍数为止,剩余的即为2~N之间的所有素数。

【源代码程序】

def sieve(n, m):
    """
    输入两个正整数n和m,返回[n,m]范围内的所有素数的列表
    """
    # 初始化一个长度为m-n+1的列表,用于标记数值是否为素数
    is_prime = [True] * (m - n + 1)
    # 如果n为1,则将1标记为合数
    if n == 1:
        is_prime[0] = False
    # 从2开始,将所有能被2整除的数标记为合数
    for i in range(2, int(m ** 0.5) + 1):
        for j in range(max(i ** 2, (n + i - 1) // i * i), m + 1, i):
            if j >= n and is_prime[j - n]:
                is_prime[j - n] = False
    # 将所有未被标记为合数的数加入素数列表
    primes = [i + n for i in range(m - n + 1) if is_prime[i]]
    return primes


# 输入n和m
n, m = map(int, input("请输入n和m(1 < n < m < 1000):").split())
if not 1 < n < m < 1000:
    print("输入有误,请重新输入")
    n, m = map(int, input("请输入n和m(1 < n < m < 1000):").split())
else:
    print("该范围内的所有素数为:", end='')
    print(sieve(n, m))

运行测试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值