我们先了解一下N进制的本质:
假设N进制每个位置上的数是a_i则一个4位的N进制数可以表示为
则这个数字的数值 =
例:10进制数178可以表示为
16进制数1AB可以表示为
然后我们再继续思考一下:如何获得一个十进制的每一位?比如:对于十进制数178,我们想要获得1、7、8,先用178对10取模,可以获得个位数8,然后将178除10,然后再对10去摸摸,可以获得10位数7......
所以,只要每次对数字取模10然后除10,就可以获得数字的每一位了,同理,对于N进制的数字来说,只要每次对数字取模N然后除N,就可以获得N进制的每一位了。

注意题目中说M是32位整数,所以有可能是负数和0,如果是0的话直接返回,如果是负数,就先转化成正数,最后再加上符号位
正数的进制转换就让M一直取余N和除N,
c++

class Solution {
public:
    string solve(int M, int N) {
            string t = "0123456789ABCDEF";
            string ans = "";
            if(M==0){return "0";}
            bool fu = false;//记录一下M是不是负数
            if(M<0){fu = true;M=-M;}//如果是负数,换成正数计算,最后再加上符号位
            while(M)
            {
                 ans += t[M%N];
                 M/=N;
            }
            if(fu){ans+="-";}
            reverse(ans.begin(), ans.end());
            return ans;
    }
};

java

import java.util.*;
public class Solution {
    public String solve (int M, int N) {
        String t = "0123456789ABCDEF";
        if(M==0){return "0";}
        StringBuffer ans =new StringBuffer();//此方法针对的是io流
        boolean fu = false;//记录一下M是不是负数
        if(M<0){fu = true;M=-M;}//如果是负数,换成正数计算,最后再加上符号位
        while(M!=0)
        {
            ans.append(t.charAt(M%N));
            M/=N;
        }
        if(fu){ans.append('-');}
        return ans.reverse().toString();
    }
}

python

class Solution:
    def solve(self , M , N ):
        t = "0123456789ABCDEF"
        ans = ""
        if M==0:
            return "0"
        fu = False
        if M<0:
            fu = True
            M=-M
        while M!=0:
            ans = ans+t[M%N]
            M = M//N;
        #如果是负数,换成正数计算,最后再加上符号位
        if fu:
            ans = ans+"-"
        return ans[::-1]