题目描述
给定一个十进制数 M ,以及需要转换的进制数 N 。将十进制数 M 转化为 N 进制数。
当 N 大于 10 以后, 应在结果中使用大写字母表示大于 10 的一位,如 'A' 表示此位为 10 , 'B' 表示此位为 11 。
若 M 为负数,应在结果中保留负号。
方法一:暴力求解--连除取余,逆向相加
求解思路
对于本题,实现进制之间的转化,我们自然想到连除取余的方法,但是题目给的是进制N,因此有可能会出现超过9的数字,因此我们先设定一个字符串常量“0123456789ABCDEF”即可。对于暴力求解,使用连除法每次取余数,连接字符串的时候每次新出现的字符需要连接在前头。
解题代码
class Solution {
public:
string solve(int M, int N) {
if(M == 0)
return "0"; // 若是0,直接返回
string hyans = "";
bool myflag = false; // 记录是正数还是负数
if(M < 0)
{
myflag = true;
M = -M;
}
string temp = "0123456789ABCDEF"; // 字符串常量
while(M)
{ //连除法
hyans = temp[M % N] + hyans; // 新字符在前,取余
M /= N;//连除操作
}
if(myflag)
hyans = "-" + hyans; // 负数添加符号
return hyans; // 返回结果
}
};复杂度分析
时间复杂度:连除操作,log级别的时间复杂度,因此为,M为十进制数大小。
空间复杂度:没有引入新的内存地址空间,空间复杂度为
方法二:优化解法--连除取余,字符串优化
求解思路
在第一种暴力解法的基础上,我们加入一个字符串从上到下记录数据,最后对字符串中的元素进行翻转操作即可。
解题代码
class Solution {
public:
string solve(int M, int N)
{
string t = "0123456789ABCDEF";
string myans = ""; // 存储结果
if(M==0)
return "0";
bool nag = false; // 记录负数
if(M<0)
{ //负数的处理
nag = true;
M=-M;
}
while(M)
{
myans += t[M%N];
M/=N;
}
if(nag)
myans+="-";
reverse(myans.begin(), myans.end()); // 翻转
return myans; // 返回结果
}
};复杂度分析
时间复杂度:连除操作,log级别的时间复杂度,因此为,M为十进制数大小。
空间复杂度:数组空间的大小为结果的大小,即连除了多少次,也是log级别,因此为.

京公网安备 11010502036488号