python获取质数
质数概念
质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
题目
统计所有小于非负整数 n
的质数。
代码
# -*- coding: utf-8 -*-
'''
质数概念:只能被1和自身整除的数字,叫做质数
'''
import math
import time
class Solution:
''' 暴力的方法,将其对每一个比其小的数进行取余运算
如果任一余数为0。则一定不是质数,否则就是质数。(数字1除外)
'''
def getPrimes(self, n: int) -> list:
Primes_list = []
for i in range(2, n+1):
sign = True
for j in range(2, i):
if i % j == 0:
sign = False
break
if sign:
Primes_list.append(i)
return Primes_list
'''
优化暴力方法,我们可以发现,假如一个数为 9 ,那么其二分之一(4.5)后的数都可以不用进行计算,
因为肯定是有余的 。事实上情况会比这更好一些:对正整数 n ,如果用 2 到 √n 之间(包含边界)的
所有整数去除,均无法整除,则 n 为质数。
'''
def getPrimes2(self, n: int) -> list:
Primes_list = []
for i in range(2, n+1):
sign = True
for j in range(2, int(math.sqrt(i))+1):
if i % j == 0:
sign = False
break
if sign:
Primes_list.append(i)
return Primes_list
'''
如果 x 是质数,那么大于 x 的 x 的倍数 2x,3x,...一定不是质数。
因此,可以进行将质数标记为1,非质数标记为0.
'''
def getPrimes3(self, n: int) -> list:
isPrimes = n*[1]
Primes_list = []
for i in range(2, n+1):
if isPrimes[i-1]:
Primes_list.append(i)
for j in range(i*i,n+1,i):
isPrimes[j-1]=0
return Primes_list
if __name__ == "__main__":
s = Solution()
time1 = time.time()
result = s.getPrimes(10000)
print(len(result), time.time()-time1)
time2 = time.time()
result2 = s.getPrimes2(10000)
print(len(result2), time.time()-time2)
time3 = time.time()
result3 = s.getPrimes3(10000)
print(len(result3), time.time()-time3)
结果
1229 0.2709805965423584
1229 0.007999658584594727
1229 0.001996278762817383
不论你在什么时候开始,重要的是开始之后就不要停止。
不论你在什么时候结束,重要的是结束之后就不要悔恨。