题目:
统计所有小于非负整数 n 的质数的数量。
思路:
对于给定的n,判断其中每一个从2~根号X的数,如果没有能够整除的数则是质数,为什么到根号X,因为根号X是自身的相乘,小于根号X的数必定与大于根号X的数相对应。
发散思路,发现计算能否被已经找到的质数整除即可。
1.对其2~根号x进行判断,超时
class Solution:
def isPrime(self,n):
for x in range(2,int(n**0.5)+1):
if n % x == 0:
return False
return True
def countPrimes(self, n: int) -> int:
num = 0
if n < 3:
return 0
for i in range(2,n):
if self.isPrime(i):
num += 1
return num
2.对已经是质数的进行判断,只对其进行整除,依旧超时,没有上述方法快
def isPrime(self,n,p):
for o in p:
if n % o == 0:
return False
return True
def countPrimes(self, n: int) -> int:
num = 1
p = [2]
if n < 3:
return 0
for i in range(2,n):
if self.isPrime(i,p):
p.append(i)
num += 1
return num
3.对其进行修改,判断是否为质数时加入开平方的限制,依旧超时,与1方法时间相同
def isPrime(self,n,p):
for o in p:
if o > int(n**0.5)+1:
return True
if n % o == 0:
return False
return True
def countPrimes(self, n: int) -> int:
num = 1
p = [2]
if n < 3:
return 0
for i in range(2,n):
if self.isPrime(i,p):
p.append(i)
num += 1
return num
4.依旧采用2的思路以空间换时间,2必然是质数,所以,2的倍数都是质数,即质数的倍数都是质数,不用除法,而是使用置零的方法对其进行统计
def countPrimes(self, n: int) -> int:
if n < 3:
return 0
prime = [1] * n
prime[0] = prime[1] = 0
for i in range(2,n):
if prime[i]:
for j in range(i*i,n,i):
prime[j] = 0
return sum(prime)