赞
踩
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123,输出: 321
示例 2:
输入: -123,输出: -321
示例 3:
输入: 120,输出: 21
示例 4:
输入: 2147483647,输出: 0
注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−{2}^3^1, {2}^3^1 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
该案例反转算法并不难,但溢出判断比较困难。下面的程序很好地解决了溢出判断的问题:
- #include <stdio.h>
- int reverse(int x) {
- int max=214748364; //比最大数少一位:2147483647,-2147483648
- int sum=0,lenth=0;
- int y=x>0?x:-x;
- printf("x=%d",x);
- while(y>0) {
- sum=sum*10+y%10;
- lenth++;
- y/=10;
- if(lenth==9&& y>0) { //还有一位,可能溢出
- if(sum>max ||(sum==max&&y>1)) return 0; //比 214748364大,乘以10肯定溢出
- }
- }
- if(x<0 )sum=-sum;
- return sum;
- }
-
- int main() {
- printf("-->%d\n",reverse(124235));
- printf("-->%d\n",reverse(-124235));
- printf("-->%d\n",reverse(2147483647));
- printf("-->%d\n",reverse(-2147483648));
- printf("-->%d\n",reverse(2147483641));
- printf("-->%d\n",reverse(-2147483641));
- printf("-->%d\n",reverse(1463847412));
- printf("-->%d\n",reverse(-1463847412));
- printf("-->%d\n",reverse(1563847412));
- printf("-->%d\n",reverse(-1563847412));
- }
运行结果:
x=124235-->532421
x=-124235-->-532421
x=2147483647-->0
x=-2147483648-->0
x=2147483641-->1463847412
x=-2147483641-->-1463847412
x=1463847412-->2147483641
x=-1463847412-->-2147483641
x=1563847412-->0
x=-1563847412-->0
分析:
关键的判断是:当sum有9位数字时,判断下一位数字的大小是否会导致乘以10溢出。
如果x是10位数字,第一位数字只能是1或2,否则无法存储为int,反转后就是最后一位数字,if(lenth==9&& y>0)就是当处理到第9位数字,还有一位数字但大于0,这时候分为两种情况:
根据以上判断,程序中:
- if(lenth==9&& y>0)
- {
- if(sum>max ||(sum==max&&y>1)) return 0;
- }
完全可以写成:
if(lenth==9&& y>0&& sum>max) return 0;
sum==max并且y>0的情况下,y必然等于1,不会溢出的。
扩展:
新的C标准支持long long类型,可以存储8个字节的整数,利用long long类型也可以很好地解决这个问题:
- #include <stdio.h>
- long long reverse(long long x)
- {
- long long max=0x7FFFFFFFFFFFFFFFLL,min=0x8000000000000000LL;
- long long sum=0;
- long long y=x>0?x:-x;
- printf("x=%d",x);
- while(y>0)
- {
- sum=sum*10+y%10;
- y/=10;
- }
- if((x>0&&sum>max) ||(x<0&&-sum<min) )
- return 0;
- else if(x>0 )return (long long)sum;
- else return -(long long)sum;
- }
-
- int main()
- {
- printf("-->%ld\n",reverse(124235));
- printf("-->%ld\n",reverse(-124235));
- printf("-->%lld\n",reverse(2147483647LL));
- printf("-->%lld\n",reverse(-2147483648LL));
- printf("-->%lld\n",reverse(2147483641LL));
- printf("-->%lld\n",reverse(-2147483641LL));
- printf("-->%lld\n",reverse(1463847412LL));
- printf("-->%lld\n",reverse(-1463847412LL));
- printf("-->%lld\n",reverse(1563847412LL));
- printf("-->%lld\n",reverse(-1563847412LL));
- }
输出:
x=124235-->532421
x=-124235-->-532421
x=2147483647-->7463847412
x=-2147483648-->-8463847412
x=2147483641-->1463847412
x=-2147483641-->-1463847412
x=1463847412-->2147483641
x=-1463847412-->-2147483641
x=1563847412-->2147483651
x=-1563847412-->-2147483651
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。