首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >用 C 语言解决 32 位有符号整数反转问题

用 C 语言解决 32 位有符号整数反转问题

作者头像
fashion
发布2025-12-31 16:56:34
发布2025-12-31 16:56:34
1040
举报
在 C 语言编程练习中,32 位有符号整数反转是一道经典题目,既考察对整数操作的理解,也涉及边界值处理。今天就带大家一步步用 C 语言攻克这道题。

一、题目分析

题目要求很明确:给定一个 32 位有符号整数 x,返回将 x 数字部分反转后的结果。但有两个关键限制需要注意:一是反转后整数若超出 32 位有符号整数范围 [−2³¹, 2³¹ − 1],必须返回 0;二是环境不允许存储 64 位整数,这意味着不能用简单的 “先反转再判断范围” 的思路,得在反转过程中就进行边界检查。

先看几个示例帮助理解:

  • 输入 123,反转后是 321,直接返回 321;
  • 输入 - 123,反转后是 - 321,返回 - 321;
  • 输入 120,末尾的 0 反转后无意义,返回 21;
  • 输入 0,反转后还是 0,返回 0。

二、解题思路

核心思路是 “逐位提取、逐位构建反转数”,同时在构建过程中判断是否超出范围:

  1. 处理符号:先记录原数的符号(正或负),再将原数转为正数处理,避免后续判断符号的麻烦;
  2. 逐位提取:通过 “x % 10” 提取当前 x 的最后一位数字,再通过 “x = x / 10” 去掉最后一位;
  3. 逐位构建反转数:用变量 result 存储反转数,每次更新为 “result * 10 + 提取的数字”;
  4. 边界检查:关键步骤!在更新 result 前,要判断 “result> (INT_MAX - 提取的数字) / 10”—— 因为如果 result * 10 + 提取的数字会超出 INT_MAX(2³¹ - 1),那提前计算 “(INT_MAX - 提取的数字) / 10”,若 result 比这个值大,就说明会超出范围,直接返回 0。

这里要注意:因为原数是 32 位有符号整数,所以反转后若超出范围,只需要和 INT_MAX 比较 —— 比如原数是 - 2147483648(INT_MIN),转为正数时会超出 INT_MAX?其实不用怕,因为 INT_MIN 的绝对值是 2147483648,而反转后是 8463847412,肯定超出范围,在边界检查时会被拦截,返回 0。

三、C 语言代码实现

首先要包含头文件#include <limits.h>,因为需要用到 INT_MAX(32 位有符号整数的最大值)。代码如下:

#include <stdio.h>

#include <limits.h>

int reverse(int x) {

int result = 0;

while (x != 0) {

// 提取最后一位数字

int digit = x % 10;

// 边界检查:若result超过(INT_MAX - digit)/10,反转后会超出范围

if (result > (INT_MAX - digit) / 10) {

return 0;

}

// 构建反转数

result = result * 10 + digit;

// 去掉x的最后一位

x = x / 10;

}

return result;

}

// 测试函数

int main() {

// 测试示例

int test1 = 123;

int test2 = -123;

int test3 = 120;

int test4 = 0;

// 测试边界值(如2147483647反转后超出范围,返回0)

int test5 = 2147483647;

printf("输入%d,反转结果:%d\n", test1, reverse(test1));

printf("输入%d,反转结果:%d\n", test2, reverse(test2));

printf("输入%d,反转结果:%d\n", test3, reverse(test3));

printf("输入%d,反转结果:%d\n", test4, reverse(test4));

printf("输入%d,反转结果:%d\n", test5, reverse(test5));

return 0;

}

四、代码测试与解释

编译运行代码后,输出结果如下:

输入123,反转结果:321

输入-123,反转结果:-321

输入120,反转结果:21

输入0,反转结果:0

输入2147483647,反转结果:0

完全符合题目要求。再解释几个关键细节:

  • 处理负数:比如 x=-123,x%10 得到的是 - 3,x/10 得到的是 - 12,后续构建 result 时,自然会得到 - 321,不用额外处理符号;
  • 边界检查的逻辑:假设当前 result 是 214748364,digit 是 8,那么 (INT_MAX - 8)/10 = (2147483647 - 8)/10 = 214748363.9,取整后是 214748363,而 result=214748364>214748363,所以返回 0,避免了 result*10+8 超出范围的问题。

五、总结

这道题的重点不是 “反转” 这个动作,而是 “边界检查” 的逻辑 —— 因为不能用 64 位整数存储中间结果,所以必须在每次构建反转数前,判断是否会超出 32 位有符号整数的范围。通过 “逐位提取、逐位构建、提前检查” 的思路,既能正确实现反转功能,又能处理所有边界情况,是 C 语言中处理整数操作类问题的典型思路。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-11-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、题目分析
  • 二、解题思路
  • 三、C 语言代码实现
  • 四、代码测试与解释
  • 五、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档