Leetcode 204. Count Primes
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode 204. Count Primes相关的知识,希望对你有一定的参考价值。
题目概述:
Description:
Count the number of prime numbers less than a non-negative number, n.
Credits:
Special thanks to @mithmatt for adding this problem and creating all test cases.
解题思路:
本题的思路分为以下几步:
- 首先建立一个长度为 n 的数组Prime,用来从0到n-1是否为素数。
- 将Prime[0]和Prime[1]设为False,因为0和1都不是素数。
- 接下来为关键步骤,即将小于n的整数中不是素数的设为False。
- 如果一个正整数可以表示为两个数(除1以外)的乘积,则该数不是素数,所以我们需要找两个数,如果这两个数的乘积小于n,则相乘得到的结果不是素数。
- 首先确定第一个乘数 i,我们需要取 i 为素数,因为非素数肯定可以由素数表达,计算非素数的乘积就造成了没有必要的额外计算量。i 的取值只需考虑 2 到 sqrt(n)+1 之间,因为当 i>sqrt(n)时,i乘比自身大的数时,其结果必然大于n,而如果 i 乘以比自己小的数时,属于多余的计算,因为这部分计算内容已经由 i 在之前取值中计算过了。
- 接下来是第二个乘数 j, j 是倍数,目的是将 n 范围内的整数中素数 i 的倍数全部剔除掉。
- 最后一步为统计Prime中剩下的True的个数,即为素数的个数
代码:
class Solution(object): def countPrimes(self, n): """ :type n: int :rtype: int """ if n <=2: return 0 Prime = [True]*n Prime[0],Prime[1] = False,False for i in range(2,int(n**0.5)+1): if Prime[i]: Prime[i*i:n:i] = [False]*len(Prime[i*i:n:i]) return sum(Prime)
以上是关于Leetcode 204. Count Primes的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode----204. Count Primes(Java)