本篇文章主要介绍了如何用Python解决一系列质数问题,解释超详细,偏口语化,简单易懂,注释详细,可能部分解释不准确,但程序均跑过一般没有问题。望采纳。
对质数于,大家听起来熟悉但如果要求准确说出概念,可能会出现语无伦次的情况,那么先来普及下什么是质数。
质数(又称素数),是指在大于1的自然数中,除了1和它本身外,不能被其他自然数整除(除0以外)的数称之为质数(素数)。比1大但不是质数的数称为合数,1和0既非素数也非合数。
那么如何用python判断一个数是否为质数有什么方法呢?
1.判断某一个数是否为质数
import math #调用math模块
def isPrime(n): #定义一个判断一个数是否为质数的函数,n为形参
if n <= 1:
return False#至此函数定义结束
for i in range(2, int(math.sqrt(n)) + 1): #编程思想,遍历2~(num开方后取整+1)(+1不包括)
if n % i == 0:
return False
return True
此程序较简单,形参和实参均用n表示 。再来详细说明一下以下代码:
for i in range(2, int(math.sqrt(n)) + 1)
range()表示有序整数序列,包括开始数字,不包括结束数字。int()代表对括号内的数据进行取整操作。math.sqrt()是math函数中开平方的操作。
举例 若输入17,即n=17,那么最终遍历结果为:2,3,4。
接下来用17除以这些值余数均不为零,所以17是质数。有关数学证明,感兴趣的话可以百度,在这里就不多赘述了。
2.求2-N之间不包括N的所有质数并输出
from math import sqrt #调用math函数中的sqrt方法
N = 99
listname=[ p for p in range(2, N) if 0 not in [ p% d for d in range(2, int(sqrt(p))+1)] ]
print(listname)
输出结果:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
这里解释一下第三行程序:
这里用到了一个列表推导式语句:
listname = [expression for variable in 对象(if condition)]
listname:新生成的列表名字
expression:表达式
variable:变量名
(if condition):用于从对象中选择符合要求的列表。
在这里2-99内的所有整数都用形参p表示,for语句遍历了每一个p,在遍历每一个p时进行了下一步操作,也就是之前提到过的指数检验方法,满足检验就会被输出到新的列表中。
3.求某一区间内质数的个数
mylist=[]
for x in xrange(2002,8008):
n = 0
for y in xrange(1,x+1):
if x % y == 0:
n = n + 1
if n == 2 :#既然只能被1或者自己整出,那说明只有2次余数为0的时候才说明这个数是质数
print x
mylist.append(x)
print mylist
xrange返回的是一个生成器,不会一下子开辟出所有的内存空间。要生成很大的数字序列的时候,用xrange会比range性能优很多,因为不需要一上来就开辟一块很大的内存空间。
4.如何优雅地判断一组数据是否全为质数
首先,第一步还是先写一个判断函数即:
def is_prime(num):
......
然后:
if __name__ == '__main__':
当运行“if __name__=='__main__':”语句时,如果当前模块时被直接执行,__name__的值就是__main__,条件判断的结果为True,“if __name__=='__main__':”下面的代码块就会被执行。换句话说当哪个模块被直接执行时,该模块“__name__”的值就是“__main__”。
接下来需要用到异常值处理中的 try...except语句,语法格式为:
try:
block
Except [typeerror ]:
deal
block为我们的程序执行过程中可能会抛出异常的语句,typeerror为错误类型,如果省略就不指定类型,即捕获全部异常,deal为具体的处理语句。
try:
my_list =[]#首先创建一个空的列表。
for i in range(4):#这里表示只处理4个数据,可根据实际情况进行修改。
s = int(input())
my_list.append(s)#将每一个输入的数据添加到my_list列表中(四个)
print('my_list当前数据:',my_list)
for i in my_list:
assert is_prime(i) == True,'ERROR'#arrest后跟的是表达式
except AssertionError:#except后跟的是错误类型
中间block部分我们首先创建一个空列表,接下来第一个for循环用来遍历我们列表中的数据,可更改,这里用4。变量s对应我们从键盘上输入的数,一共要输四个,每输一个,回车一次。appen()函数表示依次增添到列表中。
第二个for循环用来遍历我们所输入的每一个数,注意第二个for和第一个for不是嵌套关系。这里用到一个assert语句,简要说明一下:assert在程序调试的时候被称为断言,它的语法结构为:
assert expression[,describe]
expression为一个表达式,如果为真就不采取操作,反之抛出AssertionError异常。
在这里遍历到第一个不为True,for循环结束,执行deal语句即:
print('列表中存在非质数')
如果 全遍历完均为True,则输出:
print('列表中全为质数')#判断值为真的的处理语句
完整程序如下(注释均为手打,可能会有不严谨或错误,欢迎批评指点)
def is_prime(num):#num只是个形参,真正带入函数进行运算的实参是后面input()输入的数
from math import sqrt#调用math模块中的开方
for i in range(2, int(sqrt(num) + 1)):#编程思想,遍历2~(num开方后取整+1)(+1不包括)
if num % i == 0:
return False
else:
return True
if __name__ == '__main__':
try:
my_list =[]#首先创建一个空的列表。
for i in range(4):#这里表示只处理4个数据,可根据实际情况进行修改。
s = int(input())
my_list.append(s)#将每一个输入的数据添加到my_list列表中(四个)
print('my_list当前数据:',my_list)
for i in my_list:
assert is_prime(i) == True,'ERROR'#arrest后跟的是表达式
except AssertionError:#except后跟的是错误类型
print('列表中存在非质数')#判断为错误后的处理语句
else:
print('列表中全为质数')#判断值为真的的处理语句
求采纳!!!