204. Count Primes
204.1 题目描述:
Description:
Count the number of prime numbers less than a non-negative number, n.
204.2 解题思路:
思路一:分两步:第一步判断一个数是否是质数,第二步求出小于n的质数有多少。(结果超时)
- 判断是否是质数:以i循环n,起始位置是2,结束位置是n的平方根。如果n%i==0,说明可以整除,不是质数,直接返回false。循环结束,返回true。
- 求出小于n的质数的个数:如果n小于3,则返回0。计数器count初始化为1(2是质数)。以i循环n,起始位置是3,结束位置是n-1,每次i+2(偶数直接排除不是质数)。调用判断质数的函数,如果返回true,则计数器count++。最后返回count。
思路二:首先如果n小于3,则返回0。计数器count初始化为1(2是质数)。设置一个大小为n的数组v,里面都放的是true,这个数组表示从1到n-1中是否是质数。默认true是质数。以i循环n,起始位置是3,终止位置是n-1,每次i+2(偶数直接排除不是质数)。如果v[i]是true,则count++。如果i大于了n的平方根,则continue,不必进行该循环后面的操作。进入判断是否是质数循环,以k循环n,起始位置是i*i(表示第一个不是质数的位置),结束位置是n-1,每次k+i(每次i的倍数都不是质数),将v[k]=false,即设为不是质数的标识。最后返回count。这种思想是边统计质数的个数,边计算是否是质数。
204.3 C++代码:
1、思路一代码(超时):
class Solution129 {//超时
public:
bool isprime(int n)
{
int j = sqrt(n);
for (int i = 2; i <= j;i++)
{
if (n%i == 0)
return false;
}
return true;
}
int countPrimes(int n) {
if (n <= 2)
return 0;
int count = 1;
for (int i = 3; i < n;i+=2)
{
if (isprime(i))
count++;
}
return count;
}
};
2、思路二代码(22ms)
class Solution129_1 {
public:
int countPrimes(int n) {
if (n < 3)
return 0;
int count = 1;
vector<bool>v(n, true);
int j = sqrt(n);
for (int i = 3; i < n;i+=2)
{
if (v[i])
{
count++;
if (i>j)
continue;
for (int k = i*i; k < n; k += i)
v[k] = false;
}
}
return count;
}
};
204.4 Python代码:
2、思路二代码(852ms)
class Solution(object):
def countPrimes(self, n):
"""
:type n: int
:rtype: int
"""
if n<3:
return 0
a=[True]*n
j=int(math.sqrt(n))
count=1
i=3
while i<n:
if a[i]==True:
count+=1
if i>j:
i+=2
continue
k=i*i
while k<n:
a[k]=False
k+=i
i+=2
return count