Count Primes
Description:
Count the number of prime numbers less than a non-negative number, n
1. 给定一个数n,初始化一个长度比n稍微大一点的数组,num[n+1],将其初始化为1.2. (判断m是否是素数的标准是是否存在{2, ..., sqrt(m)}的数能够将这个数m整除。)
3.每次寻找num中,没有被标记为非素数的那个数,将其所有的整数倍的数,都标记为非素数。依次执行下去。
#include<cstdio>
#include<cmath>
using namespace std;
int countPrimes(int n) {
//int num[n],当n很大时,会报错
int *num = new int[n];
num[2] = 1;
//初始化时1=>n-1都是素数
for(int i = 3; i < n; i++){
if(i % 2 == 0)
num[i] = 0;
else num[i] = 1;
}
//i是区间长度
for(int i = 3; i < sqrt(n); i++){
//这个区间是其他的更小区间的公倍数,不用再判断了。肯定都是非素数
if(num[i] == 1){
//j从2开始时,是因为 素数的标准是除了1和他本身的数
for(int j = 2; j * i < n; j++){
num[i * j] = 0;
}
}
}
int count = 0;
for(int i = 2; i < n; i++){
if(num[i] == 1){
count += 1;
}
}
return count; //2是特殊的素数
}
int main(){
printf("%d", countPrimes(0));
}