题目描述:
给定n,返回小于n的素数的个数。
解题思路:
1)地毯式搜索(TLE)
即:统一从2到根号n的所有数中素数的个数,太暴力了,没过测试!
2)上下素性判别法(貌似是这个名字,TLE)
大于3的所有素数都可以表示成6*k+1或者6*k-1的形式,从而只从满足这个条件的数中进行地毯式筛选,无奈还是TLE。。。。
3)迭代向后筛选法(名字自创的,哈哈!!重点是理解思路就行)
首先分析小于n的所有数中,所有偶数肯定不是素数,所以从所有奇数中筛选;在所有奇数中,每个小奇数的奇数倍肯定也不是素数,循环至n的开平方;然后统计所有奇数中没有被标定为和数的个数,即可得到最终的count,代码如下:
int countPrimes(int n) {
if(n<=2)return 0;
bool isNotPrime[n+1]={};
for(int i=3;i<=sqrt(n);i+=2){
if(isNotPrime[i])continue;
for(int j=i*i;j<n;j+=2*i)
isNotPrime[j]=true;
}
int res=1;
for(int i=3;i<n;i+=2)
if(!isNotPrime[i])res++;
return res;
}