100个python算法超详细讲解:素数

1.问题描述
求给定范围start~end之间的所有素数。
2.问题分析
素数指的是只能被1和它自身整除的整数。
判定一个整数m是否为素数的关键,就是要判定整数m能否能被除1和
它自身以外的其他任何整数所整除,若都不能整除,则m为素数。
本题求的是给定范围start~end之间的所有素数,考虑到程序的通用
性,需要从键盘输入start和end的值,例如输入start=1,end=1000,则所编
写的程序应能够打印出1~1000之间的所有素数。
3.算法设计
由问题分析可知,该问题考虑用双层循环结构实现。
外层循环对start~end之间的每个数进行迭代,逐一检查其是否为素
数。外层循环的循环变量用变量m表示,m即代表当前需要进行判断的整
数,显然其取值范围为start≤m≤end。
内层循环稍显复杂,完成的功能是判断当前的m是否为素数。设内循
环变量为i,程序设计时i从2开始,直到 为止。用i依次去除需要判定的
整数m,如果m能够被2~  中的任何一个整数所整除,则表示i必然小于
或等于  ,并可以确定当前的整数m不是素数,因此应提前结束该次循
环。如果m不能被  中的任何一个整数所整除,则在完成最后一次循
环后,i还需要加1,即  ,之后才终止循环。此时,可以确定当前的
整数m为素数。
我们可以使用标志位flag来监控内外循环执行的情况。在定义变量时
将flag初值设为1,在内层循环中判断时,如果m能够被 中的任何一
个整数所整除,则在内循环中将flag设置为0。如果m不能被 中的任
何一个整数所整除,则在内循环中不会修改flag标志的值,退出内循环后
它的值仍为1。此时在外循环中对flag的值进行判断,如果flag=0,则显然
当前的m不是素数,如果flag=1,则当前的m是素数,应该将其打印出来。
还需要注意的是,在外循环中,每次要进行下一次迭代之前,要先将
flag标志再次置为1。
在设计算法时我们还可以定义count变量用来保存最后求得的start~
end之间素数的总个数。
4.确定程序框架
1)输入start和end并判断输入是否合法。输入start和end值,并使用
while语句来判断start和end的值是否满足条件start>0且start 则输入范围合法,否则重新输入。

print("请输入一个整数范围(start-end): ")
start = int(input("start = "))
end = int(input("end = "))
while not (start>0 and start

2)求素数。在算法设计中我们已经知道,求指定范围内的素数需要
使用双重循环,下面的代码描述了求素数的过程。

# 外层循环,对start~end之间的每个数进行迭代,检查是否为素数
m = start
while m <= end:
k = math.sqrt(m) # 求m的平方根
i = 2
while i <= k: # 内层循环,判断2~k之间的每个数是否能被m整除
# 若存在一个数能被m整除,则跳出内层循环
# 否则,m是素数,打印m
i += 1
m += 1

3)每输出15个素数则换行。定义变量count,初值为0。使用count计
数,每找到一个素数就将count值加1,接着判断当前count值是否能被15整
除,若能整除则换行,否则在当前行继续打印。代码如下:

count += 1
if count % 15 == 0: # 每15个素数换一行
print()

程序的流程图如图5.1所示。

100个python算法超详细讲解:素数_第1张图片

5.完整的程序

根据上面的分析,编写程序如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @author : liuhefei
# @desc: 素数
import math
if __name__ == "__main__":
flag = 1
count = 0
print("请输入一个整数范围(start-end): ")
start = int(input("start = "))
end = int(input("end = "))
while not (start>0 and start

 6.运行结果
在PyCharm下运行程序,屏幕上提示“请输入一个整数范围(start-
end):”,输入1和1000,即打印1~1000之间的所有素数,运行结果如图
5.2所示

100个python算法超详细讲解:素数_第2张图片

7.问题拓展
在问题分析中,我们指出素数是只能由1和它自身整除的整数。判定
一个整数m是否为素数的关键就是要判定整数m能否被1和它自身以外的任
何其他整数所整除,若都不能整除,则m为素数。因此,实际上求素数最
直观的方法就是用m依次除以2~m之间的所有整数,从而做出判断。
因此最简单直观的判断方法就是使用下面的代码,在下面的代码中循
环变量i的变化范围就是2~m。

# 判断m是否为素数
i = 2
while i <= m:
if m % i == 0:
print("%d 不是素数!" %m)
break
i = i + 1
else:
print("%d 是素数!" %m)

 而我们在解决该问题时循环变量i的变化范围是 ,显然该范围需
要判断的次数要小于对2~m之间的每个数进行判断的次数。
之所以只需要对 之间的每个数进行判断,其依据为如下定理:
如果m不是素数,则m必有满足1 根据上面的定理,我们就可以有效地减少循环判断的次数,即将循环
变量i的变化范围改为2~sqrt(m),从而提高算法的效率。代码如下:

# 判断m是否为素数
k = int(math.sqrt(m))
for i in range(2, k + 2):
if m % i == 0:
break # 可以整除,肯定不是素数,结束循环
if i == k + 1:
print(m, "是素数!")
else:
print(m, "不是素数!")

8.拓展训练
请思考问题:找出10个最小的连续自然数,它们个个都是合数(非素
数)。
9.补充知识点
聪明的你可能已经注意到了,在前面章节及本节中,我们都使用到了
Python的math模块,下面我们就来介绍一下math模块的一些相关方法,在
后续章节中也会用到。
math模块提供了对C标准定义的数学函数的访问,包括数论与表示函
数、幂函数与对数函数、三角函数、角度转换函数、双曲函数、特殊函数
及常数等。
下面介绍其中的部分常用函数,没有介绍到的函数,如果读者感兴
趣,可以自行查阅相关的资料文档。
(1)数论与表示函数
·math.ceil(x):该函数返回x的上限值,即大于或等于x的最小整数。
·math.fabs(x):该函数返回x的绝对值。
·math.factorial(x):该函数以一个整数返回x的阶乘,如果x不是整数或
为负数时,则抛出ValueError错误异常。
·math.floor(x):该函数返回x的向下取整,小于或等于x的最大整数。
·math.gcd(a,b):该函数返回整数a和b的最大公约数。如果a或b之一非
零,则gcd(a,b)的值是能同时整除a和b的最大正整数。gcd(0,0)返回0。
(2)幂函数与对数函数
·math.exp(x):该函数返回e的x次幂,其中e=2.718281...,是自然对数
的基数。这通常比math.e ** x或pow(math.e,x)更精确。
·math.expm1(x):该函数返回e的x次幂,减1。这里e是自然对数的基
数。
·math.log(x[,base]):该函数如果使用一个参数,返回x的自然对数(底
为e)。如果使用两个参数,则返回给定base的对数x,计算为
log(x)/log(base)。
·math.log2(x):该函数返回x以2为底的对数。这通常比log(x,2)更准
确。
·math.log10(x):该函数返回x底为10的对数。这通常比log(x,10)更准
确。
·math.pow(x,y):该函数将返回x的y次幂。
·math.sqrt(x):该函数返回x的平方根。
(3)三角函数
·math.sin(x):该函数返回x弧度的正弦值。
·math.cos(x):该函数返回x弧度的余弦值。
·math.tan(x):该函数返回x弧度的正切值。
·math.asin(x):该函数以弧度为单位,返回x的反正弦值。
·math.acos(x):该函数以弧度为单位,返回x的反余弦值。
·math.atan(x):该函数以弧度为单位,返回x的反正切值。
(4)角度转换函数
·math.degrees(x):该函数将角度x从弧度转换为度数。
·math.radians(x):该函数将角度x从度数转换为弧度。
(5)双曲函数
双曲函数是基于双曲线而非圆来对三角函数进行模拟。下面介绍常用
的双曲函数。
·math.sinh(x):该函数返回x的双曲正弦值。
·math.cosh(x):该函数返回x的双曲余弦值。
·math.tanh(x):该函数返回x的双曲正切值。
·math.asinh(x):该函数返回x的反双曲正弦值。
·math.acosh(x):该函数返回x的反双曲余弦值。
·math.atanh(x):该函数返回x的反双曲正切值。
(6)常数
·math.pi:数学常数圆周率π=3.141592...,精确到可用精度。
·math.e:数学常数e=2.718281...,精确到可用精度。
·math.tau:数学常数τ=6.283185...,精确到可用精度。τ是一个圆周常
数,等于2π,即圆的周长与半径之比。

你可能感兴趣的:(python,python算法,算法,python)