182.Count Primes
题目:
Count the number of prime numbers less than a non-negative number, n.
计算小于非负数n的素数的数量。
Example:
Input: 10 Output: 4 Explanation: There are 4 prime numbers less than 10, they are 2, 3, 5, 7.
说明:有4个素数小于10,它们是2,3,5,7。
解答:
方法一:超时
1 class Solution { 2 public int countPrimes(int n) { 3 int res=0; 4 for(int i=0;i<n;i++){ 5 if(isPrimes(i)) 6 res++; 7 } 8 return res; 9 } 10 11 private boolean isPrimes(int num){ 12 if(num<2) return false; 13 for(int i=2;i*i<=num;i++){ 14 if(num%i==0) 15 return false; 16 } 17 return true; 18 } 19 }
方法二:
1 class Solution { 2 public int countPrimes(int n) { 3 boolean[] notPrime=new boolean[n]; //假设全都是素数,boolean默认值全为false 4 int count=0; 5 for(int i=2;i<n;i++){ 6 if(notPrime[i]==false){ 7 count++; 8 for(int j=2;i*j<n;j++) 9 notPrime[i*j]=true; //素数的倍数都标记成不是素数 10 } 11 } 12 return count; 13 } 14 }
详解:
判断素数:埃拉托斯特尼筛法
遍历2到根号n,将质数2的全部倍数标记出来(不包括2),将质数3的全部倍数标记,一直到根号n,此时未被标记的就是质数。