[c++]关于倒转32位int整数的范围控制问题

题目来源:leetcode Reverse Integer

Given a 32-bit signed integer, reverse digits of an integer.

Example 1:            Example 2:          Example 3:

Input: 123             Input: -123         Input: 120

Output: 321          Output: -321       Output: 21

Note:

Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [?231,  231 ? 1]. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.

思路:

  • 考虑三种情况:
    1. 数值本身就溢出。
    2. 数值将要溢出,分界在未知数与INT_MAX位数相同。
    3. 数值在安全范围内。
  • 解决方案:
    1. 先判断溢出,若溢出直接返回0
    2. 边按位比较,边倒转,判断溢出,若溢出返回0
    3. 直接倒转

前提处理:

1 int m=x,i=1,ten=1;//i记录位数,ten记录最高位数要*10的
2 while(m/=10){ ++i;ten*=10;}
3 if(i<10) m=reversemin(x,i,ten);
4 else m=reversemax(x,i,ten);

判断数值溢出:

1 unsigned int y = x;//扩大范围2 if(x<0) y=-x;3 if(y>INT_MAX) return 0;

按位比较,并倒转:

 1 int reversemax(int x,int i,int ten)
 2 {
 3     int sign=1;
 4     if(x<0) {x=-x; sign=-1;}//负数变为正数,sign还原负数
 5     int m=0,max=INT_MAX;
 6     while (i--) {
 7             int rest = x % 10;
 8             int mrest=max/ten;
 9             if(rest>mrest) return 0;//与INT_MAX按位比较,如果大于则已经溢出,返回0
10             else if(rest<mrest) break;//如果小于则进入了安全范围,跳到安全的倒转
11             m += rest * ten;//只有在相等的情况才需要进行下一次比较
12             x /= 10;
13             max=max-mrest*ten;
14             ten /= 10;
15         }
16     if(ten==0) return m*sign;
17     ++i;//最后一次循环中止时,没有操作,所以还原被删去的位数
18
19     while (i--) {//正常倒转
20             int rest = x % 10;
21             m += rest * ten;
22             x /= 10;
23             ten /= 10;
24         }
25     return m*sign;
26
27 }

!负数取模之后是负数,无法进行比较,所以先取正。

!判断是否倒转完,第16行,不能用位数,因为中断出来位数也减了1

直接倒转:

 1 int reversemin(int x, int i, int ten)
 2     {
 3         int m = 0;
 4         while (i--) {
 5             int rest = x % 10;
 6             m += rest * ten;
 7             x /= 10;
 8             ten /= 10;
 9         }
10         return m;
11 }

整体代码:

 1 class Solution {
 2 public:
 3     int reverse(int x) {
 4        unsigned int y = x;
 5         if(x<0) y=-x;
 6        if(y>INT_MAX) return 0;
 7        int reversemin(int x, int i, int ten);
 8        int reversemax(int x,int i,int ten);
 9        int m=x,i=1,ten=1;
10         while(m/=10){ ++i;ten*=10;}
11         if(i<10) m=reversemin(x,i,ten);
12         else m=reversemax(x,i,ten);
13         return m;
14     }
15 };
16 int reversemin(int x, int i, int ten)
17     {
18         int m = 0;
19         while (i--) {
20             int rest = x % 10;
21             m += rest * ten;
22             x /= 10;
23             ten /= 10;
24         }
25         return m;
26 }
27 int reversemax(int x,int i,int ten)
28 {
29     int sign=1;
30     if(x<0) {x=-x; sign=-1;}
31     int m=0,max=INT_MAX;
32     while (i--) {
33             int rest = x % 10;
34             int mrest=max/ten;
35             if(rest>mrest) return 0;
36             else if(rest<mrest) break;
37             m += rest * ten;
38             x /= 10;
39             max=max-mrest*ten;
40             ten /= 10;
41         }
42     if(ten==0) return m*sign;
43     ++i;
44
45     while (i--) {
46             int rest = x % 10;
47             m += rest * ten;
48             x /= 10;
49             ten /= 10;
50         }
51     return m*sign;
52
53 }

原文地址:https://www.cnblogs.com/cuphoria/p/9588283.html

时间: 2024-07-31 13:50:49

[c++]关于倒转32位int整数的范围控制问题的相关文章

给定两个32位的整数N和M,以及表示比特位置的i和j。编写一个方法,将M插入到N中, * 使得M从N的第j位开始,到第i位结束

1 /* 2 * 给定两个32位的整数N和M,以及表示比特位置的i和j.编写一个方法,将M插入到N中, 3 * 使得M从N的第j位开始,到第i位结束,假定从j位到i位足以容纳M,也即是M=10011 4 * 那么j和i之间至少可以容纳5个数,假如,不可能出现j=3,i=2的情况,因为第三位和第二位之间放不下M 5 * 例如 6 * N=1000000000(1024) 7 * M=10011(19) 8 * i=2,j=6,输出10001001100 9 * 思路如下: 10 * 1.将N中的从

两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同

 第一种: #include<stdio.h> #include<stdlib.h> int main() {  int m,n,u;  int count=0;  scanf("%d%d",&m,&n);  u=m^n;  while(u)  {   count++;   u=u&(u-1);  }  printf("%d",count);  system("pause");  return 0;

编程实现: 两个int(32位)整数m和n的二进制表达中, 有多少个位(bit)不同?

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>int main(){int num1 = 1999;int num2 = 2299;int count = 0;int ret = num1^num2; //比特位不同异或后结果为1while (ret){ret = ret&(ret - 1);count++;} //将异或后的1输出,即有几个比特位不同printf("%d&q

求出两个int(32位)整数m和n的二进制表达中,有多少bit位不同

#include<stdio.h> #define MAX(X,Y) ((X)<(Y)?(X):(Y)) int main() { int a = 1999; int b = 2299; int num = 1; int nam; if (b % 2 == 1) { nam = 1; } else { nam = 0; } do { int A = a % 2; int B = b % 2; if (A != B) { num++; } else { num = num; } a = a

基于X86平台的PC机通过网络发送一个int(32位)整数的字节顺序

1.字节顺序 字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端.大端两种字节顺序.小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处:大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处.计算机中读取数据的时候是从高地址到低地址,存储数据时候相反! 2.主机字节序到网络字节序 基于X86平台的PC机是小端字节序的,而有的嵌入式平台则是大端字节序的.因而对int.uint16.uint32等多于1字节类型的数据,在这些嵌入式平台上应该变换其存储顺

负数二进制在32位int表示

在计算机中,负数以其正值的补码形式表达 什么叫补码呢?这得从原码,反码说起. 原码:一个整数,按照绝对值大小转换成的二进制数,称为原码. 比如 00000000 00000000 00000000 00000101 是 5的 原码. 反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码. 取反操作指:原为1,得0:原为0,得1.(1变0; 0变1) 比如:将00000000 00000000 00000000 00000101每一位取反,得11111111 11111111 11111

C编程中的8位、16位、32位整数的分解与合并

在单片机的编程中对于8位.16位.32位整数的分解与合并用的比较多,今天做了简要学习,后面还需要加以总结. 练习在VC++6.0编程环境中进行,源程序:#include <stdio.h>#include "string.h" int main(int argc, char argv[]){ unsigned int Data_Uint32=0x12345678;unsigned short int Data_Uint16_1,Data_Uint16_2;unsigned

&lt;转&gt;32位移植到64位 注意事项

32bit-64bit porting work注意事项 64位服务器逐步普及,各条产品线对64位升级的需求也不断加大.在本文中,主要讨论向64位平台移植现有32位代码时,应注意的一些细小问题. 什么样的程序需要升级到64位? 理论上说,64位的操作系统,对32位的程序具有良好的兼容性,即使全部换成64位平台,依然可以良好的运行32位的程序.因此,许多目前在32位平台上运行良好的程序也许不必移植,有选择,有甄别的进行模块的升级,对我们工作的展开,是有帮助的. 什么样的程序需要升级到64位呢? 除

JavaScript 32位整型无符号操作

在 JavaScript 中,所有整数字变量默认都是有符号整数,这意味着什么呢? 有符号整数使用 31 位表示整数的数值,用第 32 位表示整数的符号,0 表示正数,1 表示负数. 数值范围从 -2^31 - 2^31-1 即 -2147483648 到 2147483647. JavaScript 进行位操作时,是采用32位 有符号 整型,这意味着其转换的结果也是32位有符号整型. 有些时候,我们进行移位会出现意想不到的结果,以下是C语言 与 JS 的对比. C语言 1 unsigned in