我们先了解一下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]