LeetCode——计数质数

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值