##给出一个32位的有符号整数,你需要将这个整数中每位上的数字进行翻转。若翻转后超出取值范围,则输出0即可。例如,输入123 输出321;例如输入-123输出-321,用C语言代码实现,并用中文讲解细节
#include <stdio.h>
#include <limits.h>
int reverse(int x)
{
int rev=0;
//在循环内部,整数x被不断地除以10(x /= 10),
//并且取余数(int pop = x % 10),这样可以逐位获取整数的各个数字。
while (x != 0)
{
int pop = x % 10;
x /= 10;
// if(rev > INT_MAX/10 || (rev == INT_MAX/10 && pop > 7))
//INT_MAX表示整型的最大值,INT_MAX/10表示INT_MAX除以10的结果。
//i这个检查是用来判断如果rev乘以10之后会不会超过INT_MAX,
//或者如果rev乘以10等于INT_MAX的时候,再加上pop会不会超过7。
//这是因为32位有符号整数的最大值是2147483647,
//如果翻转后的数字超过这个值,就会发生溢出。
//
//
//if(rev < INT_MIN/10 || (rev == INT_MAX/10 && pop < -8))
//而INT_MIN表示整形的最小值,判断如果rev乘以10之后会不会小于INT_MIN,
//或者如果rev乘以10等于INT_MIN的时候,再加上pop会不会小于-8。
//因为32位有符号整数的最小值是-2147483648,如果翻转后的数字小于这个值,
//也会发生溢出。
if(rev > INT_MAX/10 || (rev == INT_MAX/10 && pop > 7)) return 0;
if(rev < INT_MIN/10 || (rev == INT_MAX/10 && pop < -8)) return 0;
rev = rev * 10 + pop;
}
return rev;
}
int main(int argc, const char *argv[])
{
int num;
printf("请输入一个32位有符号整数:\n");
scanf("%d",&num);
int result = reverse(num);
printf("翻转后的结果为:%d\n",result);
return 0;
}
//运行结果
ubuntu@ubuntu:holiday_test$ gcc 1_28.c
ubuntu@ubuntu:holiday_test$ ./a.out
请输入一个32位有符号整数:
-123
翻转后的结果为:-321
ubuntu@ubuntu:holiday_test$ gcc 1_28.c
ubuntu@ubuntu:holiday_test$ ./a.out
请输入一个32位有符号整数:
-1222
翻转后的结果为:-2221
ubuntu@ubuntu:holiday_test$ gcc 1_28.c
ubuntu@ubuntu:holiday_test$ ./a.out
请输入一个32位有符号整数:
-11111111
翻转后的结果为:-11111111
ubuntu@ubuntu:holiday_test$ gcc 1_28.c
ubuntu@ubuntu:holiday_test$ ./a.out
请输入一个32位有符号整数:
123456789
翻转后的结果为:987654321
ubuntu@ubuntu:holiday_test$