为何C语言nextPrime函数仅返回大于n的下一个整数?
问题原因与修复方案
你的代码问题出在isPrime函数的条件判断上:
if(!n%i)return 0;
C语言中运算符优先级是逻辑非! > 取模%,所以这个表达式会先计算!n——当n是大于等于2的自然数时,!n的结果是0,再用0对i取模,结果永远是0,导致这个if条件永远不成立。循环里的return 0从来不会被触发,所以isPrime对所有≥2的数都会返回1,自然nextPrime会直接返回第一个检查的数n+1。
修复方法很简单,给n%i加上括号,让取模运算先执行,再取逻辑非:
if(!(n%i))return 0;
修正后的完整代码:
#include <stdio.h> int isPrime(int n) { if(n<2)return 0; for(int i=2; i<n; ++i) if(!(n%i))return 0; return 1; } int nextPrime(int n) { for(int i=n+1; ; ++i) if(isPrime(i))return i; } int main(void){ int n; scanf("%d", &n); printf("%d", nextPrime(n)); return 0; }
额外优化建议:isPrime的循环可以只遍历到sqrt(n),比如把循环条件改成i*i <= n,能减少大量不必要的计算,提升函数效率。
内容的提问来源于stack exchange,提问作者Muchacho
相关产品推荐
相关产品推荐

