首先要了解该题目的意思,什么是素数?除了1和自身能被整除之外,其他数字都不能被整除的数为素数。

方法一:

那么我们可以根据素数的定义来展开程序的构造,1和自身能被整除,假如此数为n,1~n这个范围中可以将1和n视作两个边界,其中的数都不被整除即可,这样的话我们可以使用range()函数和%取模运算来展开代码。

 1 # coding=gbk
 2 while True:
 3     n = int(input("请输入一个整数:"))
 4     if n < 2:
 5        print(str(n),"不是素数也不是合数!")
 6     else:
 7         for i in range(2,n):
 8             m = n % i
 9             if m == 0:
10                 print(str(n),"不是素数!")
11                 break
12         else:
13             print(str(n),"是素数!")

1是一个边界,做特殊处理,4~5行代码。被除数从2开始算起,range()函数含左不含右,使用for循环挨个去小于n的正整数,n对其一次取模与0作比较,若等于0,进入if,输出不是素数且break终止循环,若不等于0,直接进入else,输出是素数。

在这里要注意一个问题,如下图所示:

程序里的第二个else不是和第二个if一起搭配的,如果写成图中所示,那么会出现错误,9、15等数会显示是素数,但是9、15这些数是会被3和5整除的。那么这个错误是怎么出现的呢?假如n=9,那么,进入for循环后,i取2,9%2不等于0,因此会进入else输出是素数,也就意味着i在range()函数里不会继续走下去,不会继续等于3~8,自然不会有9%3这种判别。因此,上图中的第二个else完全是没有意义的。必须让i遍历完所有的数,被n取模运算后,才能得出是不是素数的结论。

方法二:

第一种方法,逻辑思维很简单,但是如果是一个很大的数值,从2开始逐个寻找被除数,代码的运行速率会明显得降低,那么,我们可以将方法一中的代码进行优化处理。

黄色框之内的代码就是优化代码,(n**0.5)+1是对n开方+1,+1的意思是保证有些数开方后的余数可以进1,这里range()函数的取值范围就比第一种方法小得多,运行起来也效率高的多。(n**0.5)+1的前面要记得加上int(),因为这里是整数运算,开方后的数值类型为浮点数,要取其整数部分。

02-13 20:42