题目要求很明确:给定一个 32 位有符号整数 x,返回将 x 数字部分反转后的结果。但有两个关键限制需要注意:一是反转后整数若超出 32 位有符号整数范围 [−2³¹, 2³¹ − 1],必须返回 0;二是环境不允许存储 64 位整数,这意味着不能用简单的 “先反转再判断范围” 的思路,得在反转过程中就进行边界检查。
先看几个示例帮助理解:
核心思路是 “逐位提取、逐位构建反转数”,同时在构建过程中判断是否超出范围:
这里要注意:因为原数是 32 位有符号整数,所以反转后若超出范围,只需要和 INT_MAX 比较 —— 比如原数是 - 2147483648(INT_MIN),转为正数时会超出 INT_MAX?其实不用怕,因为 INT_MIN 的绝对值是 2147483648,而反转后是 8463847412,肯定超出范围,在边界检查时会被拦截,返回 0。
首先要包含头文件#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
完全符合题目要求。再解释几个关键细节:
这道题的重点不是 “反转” 这个动作,而是 “边界检查” 的逻辑 —— 因为不能用 64 位整数存储中间结果,所以必须在每次构建反转数前,判断是否会超出 32 位有符号整数的范围。通过 “逐位提取、逐位构建、提前检查” 的思路,既能正确实现反转功能,又能处理所有边界情况,是 C 语言中处理整数操作类问题的典型思路。