| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 【C】C语言判断是否质数 -> 正文阅读 |
|
[数据结构与算法]【C】C语言判断是否质数 |
类似帖子很多了,本文侧重循序渐进逐步优化的写出判断质数的代码。 1.质数定义质数 (素数)只能被 1 或自己整除。 同时它必须是大于 1 的整数。 1 不是质数也不是合成数。 常见的质数就是:2,3,5,7,11,13,17…… 2. 判断质数方法注意:为保持简洁,下面的代码都不考虑1和2,默认输入参数是大于2的整数。 1?不是质数,2是质数。 如果需要判断1和2,只需要加这个外壳就行。
2.1 方法一:除以比自己小的数字除以每个小于自己的数字,如果出现整除,那肯定不是质数。
或许,有的小伙伴会想到,如果 num?是大于2的偶数,肯定不是质数,直接返回1?不是会更快么。 加上个
变成这样:
我一开始也犯了这个错误。其实不需要加上偶数的判断,因为在?for?循环里面的 i = 2?时就已经达到了判断这个数字是否偶数的目的。 所以?我们加上的 num % 2 == 0?是多余的。 2.3?进一步:除以一半的数字我们可以缩小?i?的范围,没有必要把所有比自己小的数字都来测试一遍,只需要用其中一半来测试就够了。 比如,num是13,我们只需要用 13/2,13/3,13/4,13/5,13/6即可。
2.4?更进一步:除以更少的数字其实,只需尝试更少的数字,只需要判断到 num?的平方根即可。 C语言的库函数 sqrt(num)就是求?num的平方根,sqrt(num)?表示?num?的平方根值。 因为如果一个数可以分解为两个数的乘积的情况下,则一定是一个数在sqrt(n)的左侧,一个数在sqrt(n)的右侧,或者两数相等,均为sqrt(n)。因此,判断sqrt(n)左侧的数即可,判断其能否被n整除。
2.5?或许可以再进一步:扔掉被除数中的偶数一开始我感觉?i?中的?偶数也可以扔掉,似乎可以进一步加快循环。 因为如果?num?能被偶数整除,那说明 num?身上也带个2的因子,说明 num 本身也是个偶数啊,那num?自然就不是?质数。 但是后来仔细一想,其实并不能加快循环: 因为如果 num?是个偶数 ,在?for?循环的第一步 i=2?时,就可以判断出来了。所以后面的?i =4,i=6,i=8?根本就没有机会出场亮相,也就没有把它们排除掉的必要了。 代码略。 2.6?头撞南墙:孪生质数比较难理解,见下面链接。 【算法】素数(质数)判断方法_余 一的博客-CSDN博客_判断素数 2.7?格局打开:埃拉托斯特尼筛法
简单易懂,适合找到一定范围内的所有质数或者质数个数。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 5:20:15- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |