反转一个整数的各位数字

Reverse digits of an integer.

Example1: x = 123, return 321
Example2: x = -123, return -321

click to show spoilers.

Note:
The input is assumed to be a 32-bit signed integer. Your function should return 0 when the reversed integer overflows.

初始python解答:

class Solution(object):
    def reverse(self, x):
        """
        :type x: int
        :rtype: int
        
        """
        fuhao=0
        if x>=0:
            fuhao=1
        else:
            fuhao=-1
        revstr=str(abs(x))[::-1]
        newint=int(revstr)*fuhao
        maxint=math.pow(2,32)-1
        minint=math.pow(2,32)*(-1)
        if newint>minint and newint<maxint:
            return newint
        else:
            return 0

  此处计算绝对值字符串的反转串时,也可以先把字符串转为list,再反转list,然后再合并List。

lint=list(str(abs(x)))
lint.reverse()
revstr=''.join(lint)

下面是c++版,万恶的c++啊,反转个字符串也得自己弄,

#include<iostream>
using namespace std;
#include<string.h>
#include<math.h>
class Solution {
public:
    int reverse(int x) {
        int fuhao=0;
        if(x>=0){
            fuhao=1;
        }else{
            fuhao=-1;
        }
        //cout<<fuhao<<endl;
        int absint=abs(x);
        char revstr[20];
        sprintf(revstr,"%d",absint);
        //cout<<revstr<<endl;
        int lenrev=strlen(revstr);
        //cout<<lenrev<<endl;
        for(int i=0;i<lenrev/2;i++){
            int tmp=revstr[i];
            revstr[i]=revstr[lenrev-1-i];
            revstr[lenrev-1-i]=tmp;
        }
        int revabs;
        sscanf(revstr,"%d",&revabs);
        //cout<<revabs<<endl;
        revabs=revabs*fuhao;
        //cout<<revabs<<endl;
        unsigned int zero = 0;

        int maxint=~zero/2;
        int minint=maxint*(-1)-1;
        cout<<maxint<<endl;
        cout<<minint<<endl;
        if(revabs>minint && revabs<maxint){
            return revabs;
        }else{
            return 0;
        }
        
        
    }   
};
int main(){
    Solution s1;
    int a=s1.reverse(-198);
    cout<<a;
}

  不过c++确实严谨,另外 ,复习一下,有符号整数最高位1表示为负,0表示正,负数在计算机中以补码表示,正数以原码表示,以钟表为例子,10-4=6, 10+8=18也是6,-4=+8, 4+8=12,补码就是除符号位外按位取反加1,  -7在8位计算机上的表示就是1111   取反 1000 再加1  1001  

所以10-7 可以理解为10+ (-7)

10二进制为1010       1010+1001  ,  刚才最高位溢出,则为0011 为3,,钟表和计算机都 是一种计量机器,有个模的说法,钟表的模是12,计量范围是0-11,最大值是11,计算机来说,32位的计算机,最大值是2的21次方,最小值是0,计算机是2的位数次方,比如32位计算机是2的32次方,原码+1+反码=模  

因此计算机中负数用反码+1 表示 ,,

用钟表来举例10-4=6,这个-4可以用+8表示这个8的得来就,11-4+1,,对于计算机来说  ,

还用刚才的10-7举例,

7的二进制是0111,那么它的补码是1000,是8,两者相加刚好得到最大的1111,是15,也就是四位计算机的最大值,这样再加个1,就,16就是模了,

因为-7相当于刚才那个补码+1,也就是1001,是9,刚才7+9=16,一个轮回,也就是负数相当于是模减去该数的绝对值,原因是经过一个轮回后,最高位溢出,刚好剩下的数是相同的,10-7 相当于加了25,10+25=35,减去模32得3,类似于钟表,25的得来是    32-7得来,对应于计算机中,刚好就是按位取反加一,绝也,计算机前辈绝也!

另外,关于为啥计算机中负数的最小值会比正数的最大值多1个,可以把负数的最小值理解为-0,因为最高位是符号位,所以最大的正数只能是2的31次方,最高位的0表示正号,但是对负数来说,最高位是1,这样0x80000000这个数就空了下来,可以理解为-0,,于是计算机中就定义为负的最小值,对于钟表来说,就是10点减去24点,等于负12,也刚好是10的位置,也就是说拿钟表来比喻的话,钟表表示的数的范围是-24-11,计算机来说,就是-2的32次方到正2的32次方减1,因为算术运算的最大值不能超过最大值,不然就溢出没法计算了,因为它表示不了,,

原文地址:https://www.cnblogs.com/xqnq2007/p/7492014.html