编写一个程序,输出1到100的所有质数
def is_prime(n):
# 检查 n 是否为质数
if n <= 1: # 如果 n 小于等于 1,则不是质数
return False
# 遍历从 2 到 n 的平方根的所有整数
for i in range(2, int(n**0.5) + 1):
# 如果 n 能被 i 整除,则 n 不是质数
if n % i == 0:
return False
# 如果没有找到任何能整除 n 的数,则 n 是质数
return True
def prime_numbers_between_1_and_100():
# 初始化一个空列表,用于存放质数
primes = []
# 遍历 1 到 100 的所有整数
for num in range(1, 101):
# 检查 num 是否为质数
if is_prime(num):
# 如果是质数,则将其添加到 primes 列表中
primes.append(num)
# 返回所有找到的质数
return primes
# 调用函数并输出 1 到 100 的所有质数
print(prime_numbers_between_1_and_100())
遍历从 2 到 n 的平方根的所有整数
for i in range(2, int(n**0.5) + 1):
;为什么找质数要这样写?
在判断一个数 ( n ) 是否为质数时,我们只需要检查从 2 到 ( \sqrt{n} ) 的整数。这是因为:
因数对: 如果 ( n ) 可以被一个大于 ( \sqrt{n} ) 的数 ( a ) 整除,那么必定存在一个小于 ( \sqrt{n} ) 的数 ( b ),使得 ( n = a \times b )。也就是说,如果 ( n ) 是合数(非质数),那么它一定可以被某个小于等于其平方根的数整除。因此,检查平方根以内的整数就足够了。
效率: 通过只检查到 ( \sqrt{n} ),我们大大减少了需要进行的除法运算次数,提高了算法的效率。比如,检查 1000 是否为质数时,只需要检查到 31(即 ( \sqrt{1000} \approx 31.62 )),而不是检查到 999。
避免冗余工作: 如果 ( n ) 不是质数,那么它的因数会形成成对的组合:例如,对于数字 36,它可以被 2 和 18 整除(( 2 \times 18 = 36 )),在这对因数中,2 小于或等于 6(其平方根),而 18 大于 6。因此,只需检查小于等于 6 的数即可。
因此,使用
for i in range(2, int(n0.5) + 1)😗*
是一种既有效又简洁的方法来判断 ( n ) 是否为质数。