题目描述:
数字转换为十六进制数(Convert a Number to Hexadecimal)
给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。
注意:
- 十六进制中所有字母(a-f)都必须是小写。
- 十六进制字符串中不能包含多余的前导零。如果要转化的数为0,那么以单个字 符’0’来表示;对于其他情况,十六进制字符串中的第一个字符将不会是0字符。
- 给定的数确保在32位有符号整数范围内。
- 不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。
示例 1:输入:
26
输出:
“1a”示例 2:
输入:
-1
输出:
“ffffffff”
算法分析
题目要求将一个10进制数转换为16进制数,先考虑正整数的情况。
一个十进制正整数对16取余,余数即为结果的最低位
所以不断重复取余操作,将得到的结果转换为字符(0~f)插入输出字符串的第一位,代码如下:
char hex[16] = { '0','1','2','3', '4','5', '6','7', '8','9','a','b','c','d','e','f' };
while (n) {
s.insert(s.begin(), hex[n % 16]);
n /= 16;
}
如果是负整数时,求的就是其16进制的补码。关于补码怎么求,这里不讲原理,自行百度,只讲操作,对于16进制的负整数来说,先求其相反数的16进制,然后对其每一位数字m,将m转为15-m,最后再加1。
因为字符串的加法不好做,所以可以提前做加法,再进行运算,代码如下:
n++;
while (n) {
s.insert(s.begin(), hex[15 - n % 16]);
n /= 16;
}
代码示例
class Solution {
public:
char hex[16] = { '0','1','2','3', '4','5', '6','7', '8','9','a','b','c','d','e','f' };
string toHex(int num) {
if (num == 0) return "0";
int n = num;
if (num < 0) n = -n;
string s = "";
if (num > 0) {
while (n) {
s.insert(s.begin(), hex[n % 16]);
n /= 16;
}
}
else {
n++;
while (n) {
s.insert(s.begin(), hex[15 - n % 16]);
n /= 16;
}
int i = s.size();
// 因为16进制的正数前面的0省略,负数不能省略所以自动补f
for (; i < 8; i++)
{
s.insert(s.begin(), 'f');
}
}
return s;
}
};