【题目描述】
用户输入整数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))
【运行测试】