2-8练习

文章讲述了如何使用C语言编写函数,对32位有符号整数进行逐位翻转,同时处理可能的溢出问题,确保结果在整数范围内。
摘要由CSDN通过智能技术生成

##给出一个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$ 

                                                                                
                                                                                

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值