当前位置:   article > 正文

编程思维训练5:数字反转_给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。例如,

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。例如,

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例 1:

输入: 123,输出: 321

示例 2:

输入: -123,输出: -321

示例 3:

输入: 120,输出: 21

示例 4:

输入: 2147483647,输出: 0

注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−{2}^3^1,  {2}^3^1 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

 该案例反转算法并不难,但溢出判断比较困难。下面的程序很好地解决了溢出判断的问题:

  1. #include <stdio.h>
  2. int reverse(int x) {
  3. int max=214748364; //比最大数少一位:2147483647,-2147483648
  4. int sum=0,lenth=0;
  5. int y=x>0?x:-x;
  6. printf("x=%d",x);
  7. while(y>0) {
  8. sum=sum*10+y%10;
  9. lenth++;
  10. y/=10;
  11. if(lenth==9&& y>0) { //还有一位,可能溢出
  12. if(sum>max ||(sum==max&&y>1)) return 0; //214748364大,乘以10肯定溢出
  13. }
  14. }
  15. if(x<0 )sum=-sum;
  16. return sum;
  17. }
  18. int main() {
  19. printf("-->%d\n",reverse(124235));
  20. printf("-->%d\n",reverse(-124235));
  21. printf("-->%d\n",reverse(2147483647));
  22. printf("-->%d\n",reverse(-2147483648));
  23. printf("-->%d\n",reverse(2147483641));
  24. printf("-->%d\n",reverse(-2147483641));
  25. printf("-->%d\n",reverse(1463847412));
  26. printf("-->%d\n",reverse(-1463847412));
  27. printf("-->%d\n",reverse(1563847412));
  28. printf("-->%d\n",reverse(-1563847412));
  29. }

运行结果:

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,这时候分为两种情况:

  1. 前9位正好等于214748364,可以补一位数字1,即2147483641,很显然对应的x等于: 1463847412;不可能补2,因为2463847412对应的x不存在(无法存为int)
  2. 前9位大于214748364,无论y是多少,都必然溢出,例如:x=1563847412,反转后2147483651,溢出。

根据以上判断,程序中:

  1. if(lenth==9&& y>0)
  2. {
  3. if(sum>max ||(sum==max&&y>1)) return 0;
  4. }

 完全可以写成:

if(lenth==9&& y>0&& sum>max) return 0; 

sum==max并且y>0的情况下,y必然等于1,不会溢出的。

扩展:

新的C标准支持long long类型,可以存储8个字节的整数,利用long long类型也可以很好地解决这个问题:

  1. #include <stdio.h>
  2. long long reverse(long long x)
  3. {
  4. long long max=0x7FFFFFFFFFFFFFFFLL,min=0x8000000000000000LL;
  5. long long sum=0;
  6. long long y=x>0?x:-x;
  7. printf("x=%d",x);
  8. while(y>0)
  9. {
  10. sum=sum*10+y%10;
  11. y/=10;
  12. }
  13. if((x>0&&sum>max) ||(x<0&&-sum<min) )
  14. return 0;
  15. else if(x>0 )return (long long)sum;
  16. else return -(long long)sum;
  17. }
  18. int main()
  19. {
  20. printf("-->%ld\n",reverse(124235));
  21. printf("-->%ld\n",reverse(-124235));
  22. printf("-->%lld\n",reverse(2147483647LL));
  23. printf("-->%lld\n",reverse(-2147483648LL));
  24. printf("-->%lld\n",reverse(2147483641LL));
  25. printf("-->%lld\n",reverse(-2147483641LL));
  26. printf("-->%lld\n",reverse(1463847412LL));
  27. printf("-->%lld\n",reverse(-1463847412LL));
  28. printf("-->%lld\n",reverse(1563847412LL));
  29. printf("-->%lld\n",reverse(-1563847412LL));
  30. }

输出:

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/编程先知/article/detail/60481?site
推荐阅读
相关标签
  

闽ICP备14008679号