C语言回文数检测函数问题求助:输入121返回false
回文数检测函数的问题修正
你的代码主要问题出在最后对比首尾元素的循环逻辑上,同时缺少特殊情况处理,导致输入121时返回错误结果。以下是具体问题和修正方案:
原代码的核心错误
- 对比循环逻辑完全错误:
最后一个while循环的条件y == (g-y) && num[y] != num[g-y-2]逻辑混乱,既没正确控制循环终止条件,也颠倒了相等判断逻辑。对于输入121,该条件直接不成立,循环根本不会执行,直接走到return false。 - 特殊情况未处理:
- 负数不可能是回文数(如-121),原代码未做判断,会错误处理这类输入。
- 输入0时,原代码返回false,但0是回文数。
- 变量命名混乱:
变量y被重复用于多个场景,容易导致逻辑混淆。
修正后的代码
bool isPalindrome(int x){ // 负数直接返回false,负数不可能是回文数 if (x < 0) { return false; } // 0是回文数 if (x == 0) { return true; } int p = x; int digitCount = 0; // 计算数字的位数 while (p != 0) { p /= 10; digitCount++; } int num[digitCount]; p = x; int index = 0; // 将每一位存入数组,index从0开始,依次存个位、十位、百位... while (p != 0) { num[index] = p % 10; p /= 10; index++; } // 对比首尾元素,直到中间位置 for (int i = 0; i < digitCount / 2; i++) { if (num[i] != num[digitCount - 1 - i]) { return false; } } return true; }
修正说明
- 特殊情况处理:先判断负数和0,直接返回对应结果,避免后续无效处理。
- 清晰的变量命名:用
digitCount表示数字位数,index表示数组索引,逻辑更直观。 - 正确的对比逻辑:使用
for循环从数组两端向中间对比,只要发现任意一对元素不等就立即返回false,循环完成后说明所有对应元素都相等,返回true。 - 简化位数计算:初始
digitCount设为0,每循环一次加1,直接得到准确的位数,避免原代码中y-1这类容易出错的索引计算。
内容的提问来源于stack exchange,提问作者Peazypound1212
相关产品推荐
相关产品推荐

