LeetCode //C - 204. Count Primes

题目:计算所有小于非负整数 n 的质数的数量。

解法1:暴力法

这是最简单的方法,遍历每个数字,如果它是质数,则计数器加一。




int countPrimes(int n) {
    int count = 0;
    for (int i = 2; i < n; ++i) {
        if (isPrime(i)) {
            count++;
        }
    }
    return count;
}
 
// 判断一个数是否是质数
bool isPrime(int num) {
    for (int i = 2; i * i <= num; ++i) {
        if (num % i == 0) {
            return false;
        }
    }
    return num > 1;
}

解法2:线性筛选法

线性筛选法是一个较为高效的算法,它的基本思路是:每个合数都有一个最小质因数,那么我们只需要筛掉每个数的最小质因数即可。




int countPrimes(int n) {
    bool notPrime[n];
    int count = 0;
    memset(notPrime, false, sizeof(notPrime));
    for (int i = 2; i < n; ++i) {
        if (!notPrime[i]) {
            ++count;
            if ((long long)i * i < n) {
                for (int j = i * i; j < n; j += i) {
                    notPrime[j] = true;
                }
            }
        }
    }
    return count;
}

解法3:埃拉托斯特尼筛法

埃拉托斯特尼筛法是一种更为高效的筛法,它的基本思路是:每个合数都可以表示为几个素数的乘积,那么我们只需要筛掉每个数的素数倍就可以了。




int countPrimes(int n) {
    bool notPrime[n];
    int prime[n/log(n)], cnt, i, j;
    cnt = 0;
    memset(notPrime, false, sizeof(notPrime));
    for (int i = 2; i < n; ++i) {
        if (!notPrime[i]) {
            prime[cnt++] = i;
        }
        for (j = 0; prime[j] * i < n; ++j) {
            notPrime[prime[j] * i] = true;
            if (i % prime[j] == 0) break;
        }
    }
    int count = 0;
    for (int i = 2; i < n; ++i) {
        if (!notPrime[i]) {
            ++count;
        }
    }
    return count;
}

以上就是三种解法,其中解法2和解法3的时间复杂度都是O(n log log n),而解法1的时间复杂度是O(n log n)。在实际应用中,解法2和解法3由于没有重复的计算,会比解法1更快。

评论已关闭

推荐阅读

Vue中使用mind-map实现在线思维导图
2024年08月04日
VUE
Web前端最全Vue实现免密登录跳转的方式_vue怎么样不登录返回首页,最强技术实现
2024年08月04日
VUE
vue3 项目搭建教程(基于create-vue,vite,Vite + Vue)
2024年08月04日
VUE
Vue-颜色选择器实现方案——>Vue-Color( 实战*1+ Demo*7)
2024年08月04日
VUE
Vue项目卡顿慢加载?这些优化技巧告诉你!_vue数据多渲染卡顿
2024年08月04日
VUE
vue中的keep-alive详解与应用场景
2024年08月04日
VUE
Vue、React实现excel导出功能(三种实现方式保姆级讲解)
2024年08月04日
vue-office/docx插件实现docx文件预览
2024年08月04日
VUE
java调用js文件的两种方法(支持V8引擎)
2024年08月04日
JavaScript:解决计算精度问题/mathjs/bignumber.js/big.js/decimal.js
2024年08月04日
两周从爬虫小白变大神 _yjs_js_security_passport
2024年08月04日
JS笔记(对象、函数、数组)
2024年08月04日
Markdown.js:强大的纯JavaScript Markdown解析器
2024年08月04日
Vue项目:js模拟点击a标签下载文件并重命名,URL文件地址下载方法、请求接口下载文件方法总结。
2024年08月04日
vue 父组件怎么获取子组件里面的data数据
2024年08月04日
VUE
个人开发实现AI套壳网站快速搭建(Vue+elementUI+SpringBoot)
2024年08月04日
el-table 表格封装并改造实现单元格可编辑
2024年08月04日
none
nodejs环境下创建vue项目、SSH密钥登陆!!!
2024年08月04日
vue+quill+element-ui实现视频、图片上传及缩放保姆级教程,轻松使用富文本
2024年08月04日
【three.js】22. Imported Models导入模型
2024年08月04日