204.count primes

 

思路: 这道题的核心是判断一个数是否为素数,但是如果利用最简单的将n以内的数遍历会超时。

新的思路为那些素数的倍数的数为合数,所以可以将这些数排除,而对于一个素数p,只需要从p2开始排除,因为之前的数已经被更小的素数排除了。最后还有一点可以改进,就是p只需要判断到就可以了,以为此时p2已经大于n了。

 

 1 class Solution {
 2 
 3 public:
 4     int countPrimes(int n) {
 5       bool*isPrime = new bool[n];
 6       for (int i = 2; i < n; ++i)
 7          isPrime[i] = 1;
 8       for (int i = 2; i*i < n; ++i)
 9      {
10         if (isPrime[i])
11       {
12          for (int j = i*i; j < n; j = j + i)
13             isPrime[j] = 0;
14       }
15     }
16      int count = 0;
17      for (int i = 2; i < n; ++i)
18    {
19      if (isPrime[i])
20        count++;
21    }
22      return count;
23     }
24 };

 

posted @ 2016-11-21 17:18  Initial_Dream  阅读(108)  评论(0)    收藏  举报