Easy-题目59:204. Count Primes

题目原文:
Count the number of prime numbers less than a non-negative number, n.
题目大意:
问<n的素数有多少个?
题目分析:
使用埃拉托色尼筛法。
该算法描述如下:(Translate from wikipaedia.)
列出从2到n的序列;
初始化p为序列第一个数(目前为2,这是废话,2当然是素数了);
划掉所有p的倍数;
如果序列第一个数的平方>=n,则剩下的数都是素数,否则goto 2.
源码:(language:java)

public class Solution {
    public int countPrimes(int n) {
        if( n <=2) 
            return 0;
        int count = 1;
        boolean isNotPrime[] = new boolean[n+1];
        for(int i=3;i*i<=n;i=i+2) {
            if(!isNotPrime[i]) {
                for(int j= i*i ;j<=n;j=j+2*i) 
                    isNotPrime[j] = true;
            }
        }
        for(int i = 3;i<n;i=i+2) {
            if(!isNotPrime[i]) 
                count++;
        }
        return count;
    }
}

成绩:
11ms,beats 99.20%,众数28ms,6.70%
cmershen的碎碎念:

可能大多数提交的代码都用的是朴素解法,所以埃拉托色尼筛法可以击败这么大比例的提交代码……(暴力从2-n尝试,时间复杂度为 O(n3/2)

附朴素解法(现在提交这个好像会超时):

public int countPrimes(int n) {
   int count = 0;
   for (int i = 1; i < n; i++) {
      if (isPrime(i)) count++;
   }
   return count;
}

private boolean isPrime(int num) {
   if (num <= 1) return false;
   // Loop's ending condition is i * i <= num instead of i <= sqrt(num)
   // to avoid repeatedly calling an expensive function sqrt().
   for (int i = 2; i * i <= num; i++) {
      if (num % i == 0) return false;
   }
   return true;
}

by the way….hihocoder中似乎介绍了一个更快的算法,见http://hihocoder.com/contest/hiho93/problem/1

你可能感兴趣的:(Easy-题目59:204. Count Primes)