zoukankan      html  css  js  c++  java
  • 【LeetCode】204. Count Primes

    题目:

    Description:

    Count the number of prime numbers less than a non-negative number, n.

    提示:

    求素数个数的比较快速的方法是“埃拉托斯特尼筛法”,其原理很简单,具体的解释可以点击该链接

    代码:

    一个简单的“埃拉托斯特尼筛法”实现:

    class Solution {
    public:
        int countPrimes(int n) {
            vector<bool> prime(n, true);
            prime[0] = false;
            prime[1] = false;
            for (int i = 2; i < sqrt(n); ++i) {
                if (prime[i]) {
                    for (int j = i * i; j < n; j += i) {
                        prime[j] = false;
                    }
                }
            }
            return count(prime.begin(), prime.end(), true);
        }
    };

    上述代码在LeetCode上的执行时间超过了100ms,比预想中的要慢一些,这里面其实有很多可以优化的地方:

    • 将vector替换成单纯的bool数组;
    • 算法中,有很大一部分时间花在了筛去2的整数倍数字上,由于这些数字每隔2就出现一次,有明显的规律,因此我们可以忽略他们。

    优化后的算法如下:

    class Solution {
    public:
        int countPrimes(int n) {
            if (n <= 2) return 0;
            double c = sqrt(n);
            bool *bv = new bool[n];
            for(int i = 3; i <= c; i += 2)
                if (!bv[i]) 
                    for(int j = i*i, k = i << 1; j < n; j += k)
                        bv[j] = 1;
            int num = 1;
            for(int i = 3; i < n; i += 2)
                if(!bv[i]) num++;
            delete[] bv;
            return num;
        }
    };
  • 相关阅读:
    快速幂&欧拉降幂
    欧拉函数
    素数打表-筛法
    多源最短路径问题(Floyd算法)
    蓝桥杯-本质上升序列
    蓝桥杯-玩具蛇
    SDUT-计算机组成原理
    取消U盘和移动硬盘的GPT保护分区
    Windows 10 上运行 photoshop 等软件出现 loadlibrary failed with error 87 的解决方法!
    做题笔记
  • 原文地址:https://www.cnblogs.com/jdneo/p/4750851.html
Copyright © 2011-2022 走看看