刚接触素数 C 语言程序的新手,是不是总在想:这些代码到底是怎么判断素数的?为啥有的程序算得快,有的半天没反应?其实啊,素数程序的原理没那么复杂,哪怕是零基础,只要搞懂背后的逻辑,也能看得明明白白。今天兔子哥就用大白话讲讲素数程序的原理,再对比几种常见算法,保证你看完就通透,一起往下看吧!
先搞懂:素数到底是啥?程序判断的核心逻辑是啥?
素数这东西,说简单也简单 —— 就是大于 1 的整数里,除了 1 和它自己,再也没有别的数能整除它。比如 5,只能被 1 和 5 整除,所以是素数;6 能被 2、3 整除,就不是素数。
那程序怎么判断一个数是不是素数呢?核心逻辑其实和咱们人脑判断差不多:拿这个数去试除比它小的数,看有没有能整除的。能找到,就不是素数;找不到,就是素数。
可能有人会问,人脑能一眼看出来的数,程序为啥要一步步试除?因为电脑没人脑那么灵活,它只能按固定的步骤做事,咱们得把判断逻辑拆成它能理解的步骤,比如 “从 2 开始试除”“每次加 1”“遇到能整除的就停下”。
最基础的算法:朴素判断法(新手入门首选)
朴素判断法就像咱们刚学数数时的思路,简单直接,特别适合零基础理解。
原理详解:
判断一个数 n 是不是素数,就让 i 从 2 开始,一个个加到 n-1,每次都用 n 除以 i。如果 n 除以 i 的余数是 0(也就是 n 能被 i 整除),说明 n 不是素数;如果把 i 从 2 加到 n-1 都没找到能整除的数,那 n 就是素数。
代码核心部分:
c运行
int is_prime(int n) {if (n <= 1) return 0; // 小于等于1的数不是素数for (int i = 2; i < n; i++) {if (n % i == 0) return 0; // 找到能整除的数,不是素数}return 1; // 没找到,是素数}举个例子:判断 7 是不是素数。
i 从 2 开始:7÷2 余 1,7÷3 余 1,7÷4 余 3,7÷5 余 2,7÷6 余 1。i 跑到 6(n-1)都没找到能整除的,所以 7 是素数。
这种方法的好处是容易理解,新手一看就懂;但坏处也明显 —— 如果 n 很大,比如 100000,i 要循环到 99999,太费时间了。
优化算法 1:平方根判断法(速度快一倍)
你有没有发现,一个数 n 如果有因数,那两个因数肯定有一个小于等于√n(n 的平方根)。比如 100,平方根是 10,它的因数 2 和 50,2 就小于 10;15 的平方根约 3.87,因数 3 就小于它。
原理详解:
既然如此,咱们就不用让 i 跑到 n-1 了,跑到√n 就行。这样能少一半还多的循环次数,速度自然快很多。
代码核心部分:
c运行
int is_prime(int n) {if (n <= 1) return 0;for (int i = 2; i * i <= n; i++) { // 循环到i*i <= n为止if (n % i == 0) return 0;}return 1;}对比例子:判断 100003 是不是素数。
朴素法需要循环到 100002,而平方根法只要循环到 316(因为 316×316≈100000),循环次数一下子从 10 万次降到 300 多次,能不快吗?
优化算法 2:埃氏筛法(批量找素数的 “利器”)
如果想找出 1 到 10000 里的所有素数,用上面两种方法一个个判断,还是有点慢。这时候就该用埃氏筛法了,它是批量找素数的好办法。
原理详解:
就像筛沙子一样,先把所有数都放在 “筛子” 里,然后把已知素数的倍数都筛出去,剩下的就是素数。
步骤大概是:
- 先假设 1 到 n 的所有数都是素数(标记为 1);
- 把 0 和 1 标记为非素数(它们本来就不是);
- 从 2 开始,把 2 的倍数(4、6、8…)都标记为非素数;
- 再到 3,把 3 的倍数(6、9、12…)标记为非素数;
- 以此类推,最后没被标记的就是素数。
代码核心部分:
c运行
void sieve(int max) {int is_prime[max + 1];// 先全标记为1(假设都是素数)for (int i = 0; i <= max; i++) is_prime[i] = 1;is_prime[0] = is_prime[1] = 0; // 0和1不是素数for (int i = 2; i * i <= max; i++) {if (is_prime[i]) { // 如果i是素数,筛掉它的倍数for (int j = i * i; j <= max; j += i) {is_prime[j] = 0;}}}}这种方法的妙处在于,不用一个个判断每个数,而是通过 “筛掉倍数” 一次性找出范围内所有素数,处理大数据时特别高效。
三种算法大对比:到底该用哪种?
| 算法类型 | 优点 | 缺点 | 适合场景 |
|---|---|---|---|
| 朴素判断法 | 逻辑简单,新手易理解 | 循环次数多,速度慢 | 新手入门学习,判断小数 |
| 平方根判断法 | 循环次数少,速度快,逻辑不复杂 | 比朴素法稍难理解一点 | 单个大数判断,日常使用 |
| 埃氏筛法 | 批量找素数时速度极快 | 逻辑相对复杂,需要数组存储 | 找一定范围内所有素数(如 1 到 10 万) |
兔子哥觉得,新手刚开始学,先把朴素判断法和平方根判断法学明白就行。这两种逻辑不复杂,能帮你打牢基础。等以后需要处理大量素数了,再学埃氏筛法也不迟。
零基础学原理的小技巧
- 用具体数字代入:比如学朴素法时,拿 7、12 这样的数一步步走流程,比光看代码好懂多了。
- 画流程图:把判断步骤画成框框,比如 “输入 n→判断 n 是否≤1→是就不是素数→不是就循环试除”,一目了然。
- 多改代码试错:比如故意把平方根法的循环条件写错,看看结果会怎样,印象会更深。
其实啊,素数程序的原理说穿了就是 “找因数”,所有算法都是围绕 “怎么更快地找因数(或排除非素数)” 来优化的。零基础的朋友不用怕,先慢后快,先懂原理再抠代码,慢慢就会觉得这东西其实挺简单的。
希望这篇讲解能帮你搞懂素数程序的原理,下次再看代码时,就知道每一行是在干啥了。加油,你肯定能学会!
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~