You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言整数反转函数对大于199的整数处理异常问题排查

C语言整数反转功能的错误原因及解决方案

错误原因分析

你的代码中第一个while循环的条件x / t > 1逻辑错误,导致变量t被错误地放大了一位,进而引发后续计算错误:

比如输入x=200时:

  • 初始t=1,x/t=200>1 → t=10
  • x/t=20>1 → t=100
  • x/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 21:37:29