LeetCode Problem:Reverse Integer

C++反转整数及整数表示范围解析
本文详细解析了C++中int类型的表示范围及其原码、补码概念,通过实例展示了如何实现整数反转并处理溢出问题,深入理解整数在计算机中的存储方式。

Problem 7:Reverse Integer

Reverse digits of an integer.
Example1: x = 123, return 321
Example2: x = -123, return -321

补充


C++中int类型变量的表示范围为:-2147483648~2147483647。为什么是这个范围呢?我们知道int有32位,最高那位是符号位。注意下面说的都是原码表示,假如符号位为0,剩余的全为1,那么这个数就是2147483647,也就是int能表示的最大整数,假如符号位为1,剩余的也全为1,那么这个数就是最小的负数,也就是-2147483647。
但其实int的最小负数是-2147483648,这是一个特殊的数字,它的原码是10000000000000000000000000000000(31个0),补码也是这个。
对于原码补码用一句话总结:确定范围看原码,表示及运算用补码。

也就是说,计算机中表示一个数都是表示成补码形式,比如下面代码:

int a = 0x7fffffff;//定义a的值为0x7fffffff(补码),其实就是int的最大数。

再比如:

int a = 0x7fffffff;
int b = a+1;//此时b的补码为1000...(31个0),也就是最小的负数

下面看一个坑:

if(0 < -2147483648)
{
        cout<<"0 < -2147483648"<<endl;
}
else
{
        cout<<"0 >= -2147483648"<<endl;
}

它输出:0 < -2147483648

再看下面代码:

int MIN = -2147483648;
if(0 < MIN)
{
        cout<<"0 < -2147483648"<<endl;
}
else
{
        cout<<"0 >= -2147483648"<<endl;
}

它输出:0 >= -2147483648

解题思路:


该题就是将输入的数逆置,输入的数可以是负数且在int范围内。其实该题目关键是要解决逆置后溢出问题,由于题目超出int范围就算溢出规定输出0,那么我们可以用long long保存逆置结果再判断是否超出int范围就行。不过判断溢出的时候有个坑就是上面说的。

参考代码:

class Solution {
public:
    int reverse(int x) {
        int flags = 0;
        if(x < 0)
        {
            x = -x;
            flags = 1;
        }
        stack<int> st;
        int a;
        while(x != 0)
        {
            a = x % 10;
            x /= 10;
            st.push(a);
        }
        long long result = 0;
        long long base = 1;
        while(!st.empty())
        {
            result += st.top() * base;
            if(isOverflow(result)) return 0;
            st.pop();
            base *= 10;
        }
        if(flags == 1) result = -result;
        return result;
    }
private:
    bool isOverflow(long long x){
        int MAX = 2147483647;
        int MIN = (int)-2147483648;
        if(x > MAX) return true;
        if(x < MIN) return true;
        return false;
    }
};

转载请注明原文地址:http://blog.youkuaiyun.com/u012619640/article/details/48422567

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值