【LeetCode & 剑指offer 刷题笔记】目录(持续更新中...)
204. Count Primes
Count the number of prime numbers less than a non-negative number,
n
.
Example:
Input:
10
Output:
4
Explanation:
There are 4 prime numbers less than 10, they are 2, 3, 5, 7.
/*
问题:
数素数(质数)的个数(小于n)
方法:
Sieve of Eratosthenes solution
用已经找到的质因子i去乘,去掉合数i^2, i^2+i, i^2+2i, i^2+3i, ..., not exceeding n
举例:
n = 16(小于n,故不包含15,创建15长度,p[0]无用,直观一点,以1算起,下标与数对应)
p[0] = p[1] = false
2: 4 6 8 10 12 14
3: 9 12 15
sqrt(16) = 4
*/
class
Solution
{
public
:
int
countPrimes
(
int
n
)
{
if
(
n
<=
2
)
return
0
;
vector
<
bool
>
prime
(
n
,
true
); //初始化为true
prime
[
0
]
=
prime
[
1
]
=
false
;
for
(
int
i
=
2
;
i<sqrt(n
);
i
++) //i = 2~sqrt(n)
{
if
(
prime
[
i
])
{
for
(
int
j=i*i; j<n
;
j
+=
i
)
prime
[
j
]
=
false
;
//j = i^2, i^2+i, i^2+2i, i^2+3i, ..., not exceeding n,均不是质数
}
}
return
count
(
prime
.
begin
(),
prime
.
end
(),
true
);
}
};
/*
也可直接这样计数,比count函数更快
int result = 0;
for (int ii = 2; ii < n; ++ii)
{
if (is_prime[ii]) result++;
}
*/