题目在这:https://leetcode-cn.com/problems/count-primes/
题目分析:
质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数(规定1既不是质数也不是合数)
思路分析:
这道题直接暴力循环会超时。
看了看大佬们的思路,用了个方法叫埃氏筛
。
我们知道。2 和3 都是质数。而2 的任意整数倍都是非质数(合数)。比如:
2 * 2 ,2 * 3 ,2 * 4。3 * 2 ,3 * 3, 3 * 4.
且:
任何一个合数(非质数),都可以以唯一的形式被写成有限个质数的乘积,即分解质因数。
超过根号 n 的合数都可以进行因式分解,其中最小的因子必然为根号 n 以内的一个质数。
这样一来我们只需剔除掉根号 n 以内的质数倍数,即排除了 n 以内的所有合数,剩下来的就都是质数啦。
可以创造一个数组,数组长度等于所给数,让里面都为True,即表示为质数,然后筛选所有合数,标记为False。最后统计数组中True的个数即为质数个数。
完整代码
class Solution:
def countPrimes(self, n: int) -> int:
if n < 2:
return 0
import math
res = [True] * n # 全部标记为质数
res[0] = False
res[1] = False
lenght = math.sqrt(n)
for i in range(2,int(lenght)+1): # 埃氏筛掉所有合数
for j in range(i * i,n,i):
res[j] = False
print(res.count(True))
return res.count(True)