leetcode 204 count prim 数素数

描述:

给个整数n,计算小于n的素数个数。

思路:

埃拉托斯特尼筛法,其实就是普通筛子,当检测到2是素数,去除所有2的倍数;当检测到3是素数,去除其倍数。

不过这要求空间复杂度为n,时间复杂度为n。

解决:

int countPrimes(int n) {
    if (n < 3)
        return 0;
    int count = 1;
    bool* no = new bool[n]{n, false};
    
    for(int i = 3; i < n; i+=2) {
        if (!no[i]) {
            count++;
            long j = (long)i * i;
            for (; j < n; j += i*2)  // 此处优化重要!
                no[j] = true;
        }
    }
    return count;
}

有几个注意的地方。

1. no数组用new,不要用vector,由于操作简单。

2. 更新时,从i * i开始,比i小的数,都给比i小的质数给更新了。

3. 每次步进2i,如果一次步进i,则为2i,偶数。

posted on 2018-01-12 17:53  willaty  阅读(146)  评论(0编辑  收藏  举报

导航