以下是使用 for 循环写出筛选法求解小于 n 的所有素数的 Python 代码:

n = int(input('请输入一个正整数 n:'))

# 创建一个长度为n的布尔数组,初始值都为True
is_prime = [True] * n

# 0和1不是素数,因此将它们设为False
is_prime[0] = False
is_prime[1] = False

# 从2开始遍历到n的平方根
for i in range(2, int(n ** 0.5) + 1):
    # 如果i是素数,那么将i的倍数都设为False
    if is_prime[i]:
        for j in range(i ** 2, n, i):
            is_prime[j] = False

# 打印小于n的所有素数
print('小于{}的素数有:'.format(n))
for i in range(2, n):
    if is_prime[i]:
        print(i, end=' ')

运行结果:

请输入一个正整数 n:30
小于30的素数有:
2 3 5 7 11 13 17 19 23 29

代码解释:

  1. 初始化布尔数组:创建一个长度为 n 的布尔数组 is_prime,初始值都为 True,表示所有数字都可能是素数。
  2. 设置 0 和 1:将 is_prime[0]is_prime[1] 设为 False,因为 0 和 1 不是素数。
  3. 筛选素数:使用两层循环进行筛选。外层循环遍历从 2 到 n 的平方根,内层循环将当前素数的倍数设为 False。
  4. 打印素数:遍历 is_prime 数组,将值为 True 的索引打印出来,即小于 n 的所有素数。

筛选法的原理:

筛选法是一种高效的求解素数的算法。其核心思想是:

  • 假设所有数字都是素数。
  • 从 2 开始,将每个数字的倍数都标记为非素数。
  • 最后剩下的未被标记的数字就是素数。

例如,求解小于 10 的所有素数:

  • 初始化 is_prime 数组:[True, True, True, True, True, True, True, True, True, True]
  • 将 0 和 1 设为非素数:[False, False, True, True, True, True, True, True, True, True]
  • 2 是素数,将它的倍数设为非素数:[False, False, True, False, True, False, True, False, True, False]
  • 3 是素数,将它的倍数设为非素数:[False, False, True, False, True, False, True, False, True, False]
  • 4 已经被标记为非素数,跳过
  • 5 是素数,将它的倍数设为非素数:[False, False, True, False, True, False, True, False, True, False]
  • 6 已经被标记为非素数,跳过
  • 7 是素数,将它的倍数设为非素数:[False, False, True, False, True, False, True, False, True, False]
  • 8 已经被标记为非素数,跳过
  • 9 已经被标记为非素数,跳过

最终,is_prime 数组为 [False, False, True, False, True, False, True, False, True, False],小于 10 的所有素数为:2, 3, 5, 7。


原文地址: https://www.cveoy.top/t/topic/ngPc 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录