链接: https://leetcode.com/problems/count-primes/#/description
Description:
Count the number of prime numbers less than a non-negative number, n.
计算小于n的素数的个数。
这道题用普通方法来判断素数的话必然超限,在别人的博客上看到了一个比较高效的判断素数的方法: 大于等于5的质数一定和6的倍数相邻。例如5和7,11和13,17和19等等;换句话说:不与6的倍数相邻的数一定不是素数,与6的倍数相邻的数不一定是素数。所以我们先排除掉不与6相邻的数,再判断与6的倍数相邻的数是否是素数。代码如下:
int countPrimes(int n) {
int sum = 0;
if(n==0 || n==1) return 0;
for(int i=2; i<n; i++){
if(isPrime(i)) sum++;
}
return sum;
}
bool isPrime(int num){
if(num ==2|| num==3 )
return true ;
//不在6的倍数两侧的一定不是质数
if(num %6!= 1&&num %6!= 5)
return false ;
int tmp =sqrt( num);
//在6的倍数两侧的也可能不是质数
for(int i= 5;i <=tmp; i+=6 )
if(num %i== 0||num %(i+ 2)==0 )
return false ;
//排除所有,剩余的是质数
return true ;
}