题目 给你一个 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)
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> 头文件。
|