C语言整数反转函数对大于199的整数处理异常问题排查
C语言整数反转功能的错误原因及解决方案
错误原因分析
你的代码中第一个while循环的条件x / t > 1逻辑错误,导致变量t被错误地放大了一位,进而引发后续计算错误:
比如输入x=200时:
- 初始
t=1,x/t=200>1→t=10 x/t=20>1→t=100x/t=2>1→t=1000- 此时
x/t=0,不满足>1,循环停止,p=1000
进入第二个循环后,第一次迭代t=1000,d=x/t=0,执行y = y + p * d / t后y仍为0;后续处理有效数字时,最终得到y=20,而正确结果应为2——多余的末尾0就是这次无效的0位计算导致的。
可行解决方案
方案1:修正第一个循环的条件
把第一个while循环的条件改为x / t >= 10,确保t停在对应最高位的位数上:
int reverse(int x) { int t = 1, y = 0, neg = 0; if (x < 0) { neg = 1; x = -x; } // 修正循环条件:当x/t >=10时,继续放大t while (x / t >= 10) { t = t * 10; } int p = t; while (t >= 1) { int d = x / t; y = y + p * d / t; x = x - d * t; t = t / 10; } if (neg == 1) { y = -y; } return y; }
方案2:改用逐位取余累加的通用写法
这种写法无需预先计算最高位,逻辑更简洁,还能避免位数计算错误,同时支持溢出判断:
#include <limits.h> int reverse(int x) { int result = 0; while (x != 0) { int digit = x % 10; // 检查正数溢出 if (result > INT_MAX / 10 || (result == INT_MAX / 10 && digit > 7)) { return 0; } // 检查负数溢出 if (result < INT_MIN / 10 || (result == INT_MIN / 10 && digit < -8)) { return 0; } result = result * 10 + digit; x = x / 10; } return result; }
说明:该方法通过x%10逐位取出末尾数字,用result*10 + digit将数字累加到结果中,无需单独处理负数(C语言对负数的取余和除法会保留符号),同时加入了溢出判断,避免未定义行为。
补充说明
原代码中x = -1 * x处理负数存在风险:当x为INT_MIN(即-2147483648)时,-x会超过int的最大值INT_MAX(2147483647),导致溢出未定义行为,方案2的写法规避了这个问题。
内容的提问来源于stack exchange,提问作者Confused Coder
相关产品推荐
相关产品推荐

