题目链接
点此,题目描述如下:
Reverse digits of an integer.
Example1: x = 123, return 321
Example2: x = -123, return -321
直接使用int来处理输入的数据,虽然输入的时候不会溢出,但是并不能保证reverse之后不超出int的表示范围。在32bits中,int的表示范围为:
int 2147483648~2147483647
例如如果输入的是:1534236469,则反转后就变成9646324351,这就超出了int的表示范围,总的程序框架如下:
#include <stdio.h>
#define HIGH_BITS 0xFFFFFFFF10000000
#define UPPER_LIMIT 0x7FFFFFFF
int main(int argc, char* argv)
{
int a = 0;
int reverse(int x);
while (scanf("%d", &a) != EOF)
printf("%d\n", reverse(a));
return 0;
}
int reverse(int x)
{
int isNative = x > 0 ? 1 : -1;
unsigned int native_X = isNative * x;
unsigned int tmpResult = 0;
while(0 != native_X)
{
//取余
//求和
}
return tmpResult * isNative;
}
起初想到的以下三种方法:
F1:
在对tmpResult求和之前,先比较tmpResult*10 与 UPPER_LIMIT的大小,
while(0 != native_X)
{
if (tmpResult * 10 > UPPER_LIMIT)
{
tmpResult = 0;
break;
}
tmpResult = native_X % 10 + tmpResult * 10;
native_X = native_X / 10;
}
如果使用这种方法,由于tmpResult为int类型,tmpResult*10获得的值也为int类型,如果使用1534236469,在最后一次循环中,即得到的964632435*10同样会超出int的表示范围,所以,需要将tmpResult换为__int64即64位
F2:
F1中的方法,虽然可以AC,但是效率不行,因为每次取余后都需要判断一次,严重影响了执行效率,经过考虑后将while中的判别条件放在return之前,这样会提高一下效率(从原来的12ms降低到8ms)
int reverse(int x)
{
int isNative = x > 0 ? 1 : -1;
unsigned int native_X = isNative * x;
__int64 tmpResult = 0;
while(0 != native_X)
{
tmpResult = native_X % 10 + tmpResult * 10;
native_X = native_X / 10;
}
if (tmpResult > UPPER_LIMIT)
{
tmpResult = 0;
}
return tmpResult * isNative;
}
这种方法本质上和F1相同,或许不应该称为F2
F3:
通过bit求&运算,但是这种方法还没调试好……