我们先了解一下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]
京公网安备 11010502036488号