一、问题
统计所有小于非负整数 n 的质数的数量。
示例:
提示: 0 <= n <= 5 * 106
二、解题思路
厄拉多塞筛法
- 先将 2~n 的各个数放入表中
- 然后在2的上面画一个圆圈,然后划去2的其他倍数;
- 第一个既未画圈又没有被划去的数是3,将它画圈,再划去3的其他倍数;
- 现在既未画圈又没有被划去的第一个数 是5,将它画圈,并划去5的其他倍数……
- 依次类推,一直到所有小于或等于 n 的各数都画了圈或划去为止。这时,表中画了圈的以及未划去的那些数正好就是小于 n 的素数。
注意:其实当要画圈的素数的平方大于 n 时,后面没有划去的数都是素数
三、代码
int countPrimes(int n){
if(n < 3)
return 0;
int number[n];
int count = 0; // 合数计数
// 初始化
for(int i = 0; i < n; i++)
number[i] = 1;
for(int i = 2; i * i <= n; i++){
if(number[i] == 0)
continue;
for(int h = 2 * i; h < n; h += i){
if(number[h]){
number[h] = 0;
count++;
}
}
}
int ret = n - 2 - count;
return ret;
}