计算小于非负数n的质数数。
Input: 10
Output: 4(2,3,5,7)
素数就是除了1和它本身不能被其他数整除的数
开始用了判断每个数是不是素数然后把它去除的方法但是运行超时了>_<
class Solution:
def countPrimes(self, n: int) -> int:
res=list(range(2,n)) #生成2到n的list
for i in range(2,n+1): #需要运算到n,所以要n+1
for j in range(2,int(i**0.5)+1): #判断i能不能被比它小的数整除,如果能就从list中去除
if i%j==0 and i in res:
res.remove(i)
return len(res)
优化了一下,变成除了前两个数其它全为1的 list,如果不是素数就变成0
class Solution:
def countPrimes(self, n: int) -> int:
res=[0,0]+[1]*(n-2)
for i in range(2,int(n**0.5)+1):
for j in range(2*i,n,i): #i的2倍开始,2i,2i+i,2i+2i,2i+3i...n
res[j]=0
return sum(res) #res里面的数累加
1. n开方之后的数是前面的素数的倍数所以n**0.5
2. 建立list而不是直接设置累加因为会两个for循环会重复算里面的数,比如n=10,循环中6可以被2和3整除,所以对6操作了两次
关于素数和其算法可以看https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes里面有图很直观