质数又称素数,指在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数。换句话说,只有两个正因数(1和自己)的自然数即为素数。比1大但不是素数的数称为合数。1和0既非素数也非合数。合数是由若干个质数相乘而得到的。
质数的判断:
1、只能被1和本身整除。
2、不能被小于它的平方根的所有素数整除就是素数。
一、常规算法
直接用定义做,判断n是否为素数,就用2~n-1去除n,如能被整除则不是素数,否则为素数。代码如下:
求n以内的所有素数的时间复杂度:O(n²)
def isprime(n):
for j in range(2, n): # 2~n-1,不包括n
if (n % j == 0): # 能被2~n-1(不包括n)整除,不是素数
return False
else:
return True # 循环正常结束是素数(没有被整除)
P = []
for i in range(2, 10**8+1): # 求10⁸以内的素数
if isprime(i):
P.append(i)
print(P)
二、常规优化算法
上述算法中循环次数为2~n-1,共n-2次。因为因数是成对出现的,一个小于等于算术平方根,另外一个大于等于算术平方根。所以只需测试小于等于算术平方根的因数是否存在,如存在则不是素数,否则就是素数。代码如下:
求n以内的所有素数的时间

本文介绍了判断质数的几种算法,从基本的直接判断到常规优化算法,再到埃氏筛法和欧拉筛法,强调了算法的效率提升,如埃氏筛法的时间复杂度为O(nlog(logn)),而欧拉筛法的时间复杂度为O(n)。这些方法用于寻找大范围内的素数,例如10^8以内的素数。
最低0.47元/天 解锁文章
1107

被折叠的 条评论
为什么被折叠?



