问题描述
提示:
统计所有小于非负整数 n 的质数的数量?
我们知道质数的定义是只能被1和它自身整除。根据定义设计如下解答方法。
方法一:暴力穷举
从2到n,逐个数字检查,能不能是只被1和它自身整除。·首先定义的函数is_primes是检查数字c是不是质数的函数。下面的for循环用来遍历2~n之间的所有数字。时间复杂度为O(N2)
代码如下:
def countPrimes(self, n: int) -> int:
def is_primes(c):
for i in range(2, c):
if c % i == 0:
return False
return True
ans = 0
for j in range(2, n):
if is_primes(j):
ans += 1
return ans
2.改进版暴力穷举
我们知道,如果一个数字不是质数,那么他最少存在两个因数(除1和它自身),而这两个因数中较小的一定在1~c^1/2之间。那么在检查一个数字是不是质数的时候可以只除以2到[c**1/2].
代码如下(示例):
def countPrimes(self, n: int) -> int:
def is_primes(c):
for i in range(2, c):
if c % i == 0:
return False
if i*i>c:
break
return True
ans = 0
for j in range(2, n):
if is_primes(j):
ans += 1
return ans
3.捷径版穷举
从上述方法我们已经知道了2,4,6,8等不是质数。所以我们只需要除以已有质数即可。
def countPrimes(self, n: int) -> int:
prime_list = []
for c in range(2, n):
for i in prime_list:
if c % i == 0:
break
else:
prime_list.append(c)
return len(prime_list)