題目描述:
數字轉換爲十六進制數(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;
}
};