c 语言证明是否素数: 要判断一个数是不是素数,实际上就是看它能不能被小于等于它本身的整数整除。
要是你手边拿着一堆数字,比如 12 要么 7,直接转成十进制,然后从 2 往上试,要是整除就哑巴吃黄连有苦说不出。
实际上不用写那么复杂的循环,c 语言里有个现成的函数 `is_prime` 就能搞定,但咱得把它掰开揉碎,看看底层到底是如何出马的。 起初得踩死一个坑:1 绝对不是素数,这是数学常识也是编程铁律。别看 200 以内要么 1000 以内的数会加上 1,但 11 和 121 这种带 1 的情况得单独拎出来,不然程序跑起来就出 Bug,肯定得加个 `if (n 1) return false;` 这个预判动作。 然后看两个小细节,能被 2 整除的偶数肯定不是素数了,像 4、6、8 这种一眼就能看出来的,直接回 false。别看 2 是最小的素数,但它也是偶数,故此这个判断实际上涵盖了所有偶数,有点“大材小用”,但为了逻辑清楚,还是保留着吧,毕竟非负数范围里 2 是特殊的。 接下来是核心逻辑,也就是试除法。用 `is_prime(n)` 函数,第一层循环就是判断 `n` 本身,要是小于 2 直接回 false。
然后从 2 启动一层层往上试,一旦能整除,立马退出循环要么回 false。
这个循环结构实际上是数学定义的直接翻译:一个数要么有因数,要么没有因数,要么就是素数。 为了验证这段代码是不是真能跑通,咱们来套个具体场景。
比如输入 17,它是一个素数。程序启动后,`n` 是 17。
第一层判断 `n < 2` 不成立。
第二层循环从 2 启动试。17 除以 2 余 1,不整除;3 除它余 2,也不整除;4 除它余 1。一直往下试到 17 本身。
这时候 `n` 等于 17,正好相等,没有发现任何能整除它的数(除了它自己,但算法里一般只试到 `sqrt(n)` 要么到 `n/2` 左右,具体实现细节不同,但逻辑核心一致)。循环终止后,没发现因数,函数回 true。
看来它确实是素数。 再比较一下 21 这个数,它不是素数。`n` 变成 21。
第一层判断黄了。循环启动试 2,21 除以 2 余 1。持续试 3,21 除以 3 整除,14,整除!循环中断,回 false。
这里的“整除”在 c 语言里对应 `%` 运算符,`21 % 3 0` 这个条件一成立,逻辑就断了,不用再去试 4、5、6 了。
这就像在找小偷,一眼发现他手里拿着 3 元面值的硬币,直接锁了门。 实际上这种试除法效率挺低的,毕竟它得从最小的数一直试到根号,对于大数来说忒慢了。
不过对于面试要么基础练习来说,这就是最标准的写法了。
要是要优化,那就要引入埃拉托斯特尼筛法要么好办的打表法,那是另一套热身戏码。 最终总结一下,判断素数的本质是遍历所有可能的因数,要是找不到能整除它的,那它就是素数。c 语言的 `while` 循环和 `%` 取模运算符配合起来,就能把抽象的数学定理变成一行行可执行代码。别看这玩意儿对于大数来说不够优雅,但对于理解素数结构、练习算法思维、还有处理各种边界情况(比如 1、负数、偶数)贼有价值。在写程序时,把逻辑拆解清楚,比记住一堆复杂的公式更关键。