在数学定义中,素数(质数)即为除了1和该数自身外,无法被其他整数整除的数。且1不为素数(质数)。
素数基本特点
- 1不是素数,2是素数,3是素数
- 除2以外的数一定是奇数,因为偶数能被2整除
- 大于3的素数一定满足6n+1或6n+5型,其中n是非负整数,但满足6n+1或6n+5不一定是素数
对第3点做一些说明。如果一个数满足6n+2 ,则能被2整除,6n+4同理。如果一个数满足6n或者6n+3,则一定能被3整除。所以一个大于3的数若是素数一定满足6n+1或者6n+5。
代码思路如下
- 用if语句判断,若m=1,则返回False(表示m不是素数)。若m=2或m=3,则返回True(表示m是素数)
- 用if语句判断,若m%6 != 1且m%6 != 5,则m一定不是素数,返回False
- 若m%6 = 1或者m%6 = 5,则说明m有可能为素数,再遍历寻找m的因数(假设因数为i),若找到某个非1和m本身的i,则m不是素数,返回False。遍历时掌握一定技巧,若存在符合条件的因数,则该因数一定是小于等于根号m的整数,且该因数一定满足6n+1或者6n+5。原因很简单,若i=6n,i=6n+2,i=6n+3或者i=6n+4,则i本身就可以被2或3整除,所以m一定不符合6n+1或6n+5
代码如下
import math
def isPrime(m):
if m == 1:
# print(m, '不是素数')
return False
if m == 2 or m == 3:
# print(m, '是素数哦')
return True
if m % 6 != 1 and m % 6 != 5:
# print(m, '不是素数')
return False
else:
n = int(math.sqrt(m))
for i in range(5, n + 2, 6):
#遍历寻找m可能的因数i,循环的步长设为 6
#每次只判断 6 两侧的数是否是m的因数即可
if m % i == 0 or m % (i + 2) == 0:
# print(m, '不是素数')
return False
# print(m, '是素数')
return True