LeetCode——计数质数
题目描述:
统计所有小于非负整数 n 的质数的数量。
示例 1:
输入:n = 10
输出:4
解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
示例 2:
输入:n = 0
输出:0
示例 3:
输入:n = 1
输出:0
提示:
0 <= n <= 5 * 106
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-primes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
首先明确质数的定义,质数就是只能被或者其本身整除的数。
解法一:暴力法
我们写一个判断一个数是否是质数的函数isPrime。
然后一个一个数去判断该数是否是质数,是的话质数个数加一。
但是暴力法用的时间很多,如果数字很大的话会超出时间限制。
解法二:埃氏筛
原理:当我们找到一个质数的时候,这个数的倍数一定不是质数。
我们定义一个元素全为1的数组isprime。
我们从小到大遍历每一个数,如果他是质数,令count自增1,并将其所有倍数对应的isprime[ i ]设为0。
暴力法python代码:
class Solution(object):
def countPrimes(self, n):
"""
:type n: int
:rtype: int
"""
count = 0
for i in range(2, n):
if self.isPrime(i):
count += 1
return count
def isPrime(self, num):
for i in range(2, num):
if num % i == 0:
return False
if i * i > num:
break
return True
埃氏筛python代码:
class Solution(object):
def countPrimes(self, n):
"""
:type n: int
:rtype: int
"""
isprime = [1 for i in range(n)]
count = 0
for i in range(2, n):
if isprime[i]:
count += 1
for j in range(2 * i, n, i):
isprime[j] = 0
return count