leecode7 整数反转

题目
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。

代码一(假设环境不允许存储 64 位整数(有符号或无符号)。)

int reverse(int x){
    int s=0;
    while(x!=0)
    {
        if(s<INT_MIN/10||s>INT_MAX/10)
            return 0;
        s=s*10+x%10;
        x/=10;
    }
        return s;
}

这里的if(s<INT_MIN/10||s>INT_MAX/10) 之所以要有除10的操作,是为了保证 s=s10+x%10; 这句话不出错误,假设一次循环后s临近 int 所能表示的临界范围,若此时循环结束则没有什么影响,但若没有结束,在进行下一次循环时,假设if语句没有除10那部分内容,那么此时的s是不满足if的条件的,因为虽然它快到边界值,但毕竟还没到,接着再执行下一行语句 s=s10+x%10,因为有乘以10这个内容所以肯定是超过int的边界值,的这就导致程序会报错,无法返回正确的内容,

代码二(假设环境允许存储 64 位整数(有符号或无符号)。)

int reverse(int x){
    long long int s=0;
    while(x!=0)
    {
        s=s*10+x%10;
        x/=10;
    }
        if(s<INT_MIN||s>INT_MAX)
        //if(s<(-1*pow(2,31))||s>(pow(2,31)-1))这样写也可以
            return 0;
        else
            return s;
}

说明(摘抄网址:http://c.biancheng.net/ref/limits_h/)
INT_MAX与INT_MIN是C语言库#include<limits.h>库中定义的宏,分别代表int类型所能表示的最大值与最小值

C语言的一个优良传统是标量类型(整数是典型的标量类型)要以一种对每个计算机
体系结构都很自然的方式表示。例如,基本整型 int 的弹性就很大,它希望自己
的大小等于一个机器字长:

在 16 位环境中,机器字长为 16 位,int 占用 2 个字节;
在 32 位环境中,机器字长为 32 位,int 占用 4 个字节;
在 64 位环境中,机器字长为 64 位,int 依然占用 4 个字节。

由此可知在64 位环境中int类型占用的并不是一个机器字长,依旧是4个字节,这是
因为计算机发展到64位时c语言已经存在了很多年,此时已经有大量基于 32 位环境
编写的代码,这些代码中Int类型占据的就是4个字节,若是64为环境中int类型变为
8个字节,那么这些代码便不一定能继续运行,因此,64 位环境下的 int 依然占用
4 个字节的内存。
 
 这对于程序的效率而言是个好事,但从可移植性来说是个麻烦,因此,C语言标准委
 员会发明了 <limits.h> 头文件来捕捉标量类型在不同计算机体系结构之间的变化。

<limits.h> 头文件没有定义任何函数或者类型,仅定义了一些与整数类型有关的宏。如果想获取与浮点数有关的特性,应该查看<float.h> 头文件;如果查看指定长度的整数类型,应该查看 <stdin.h> 头文件。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值