
本文详解素数判断程序中计数器(count)始终为0的根本原因,指出模运算对象颠倒这一常见错误,并提供修正后的完整代码与关键原理说明。
本文详解素数判断程序中计数器(count)始终为0的根本原因,指出模运算对象颠倒这一常见错误,并提供修正后的完整代码与关键原理说明。
在使用循环判断一个正整数是否为素数时,常见的思路是:遍历从 2 到 num-1(或更优地到 √num)的所有整数 i,检查 num 是否能被 i 整除。若存在任一 i 满足 num % i == 0,则 num 不是素数。此时,我们常借助一个整型变量 count 统计能整除 num 的因子个数(通常只需发现一个即可提前判定,但初学者常以 count > 0 作为合数依据)。
然而,许多初学者会误写成 if (i % num == 0) —— 这表示“用当前循环变量 i 去除以输入数 num”,而非“用 num 去除以 i”。由于 i 通常远小于 num(例如 num = 10, i 从 2 开始),i % num 恒等于 i(除非 i >= num),永远不为 0,因此 count++ 语句永不执行,最终 count 始终为 0,导致逻辑完全失效。
✅ 正确写法必须是:
int count = 0;
for (int i = 2; i <= num / 2; i++) {
if (num % i == 0) { // 关键:num 被 i 整除
count++;
}
}
if (count == 0) {
printf("%d is a prime number.\n", num);
} else {
printf("%d is not a prime number.\n", num);
}⚠️ 注意事项:
-
效率优化:无需遍历至
num/2,只需到√num即可(因为若num有大于√num的因子,则必对应一个小于√num的配对因子); -
边界处理:
1不是素数,2是最小素数,需单独判断; -
提前退出:一旦
count > 0,可立即break,避免冗余计算; -
变量作用域与初始化:确保
count在循环外正确定义并初始化为0。
总结:count 不递增的本质是条件逻辑错误,而非循环结构或自增语法问题。牢记素数判定的核心是「被试数能否被候选因子整除」,即 num % i == 0,而非其逆运算。修复此逻辑后,计数器将准确反映因子数量,程序行为回归预期。

















