题目:
Given an integer, write an algorithm to convert it to hexadecimal. For negative integer, two’s complement method is used.
Note:
- All letters in hexadecimal (
a-f
) must be in lowercase. - The hexadecimal string must not contain extra leading
0
s. If the number is zero, it is represented by a single zero character'0'
; otherwise, the first character in the hexadecimal string will not be the zero character. - The given number is guaranteed to fit within the range of a 32-bit signed integer.
- You must not use any method provided by the library which converts/formats the number to hex directly.
Example 1:
Input: 26 Output: "1a"
Example 2:
Input: -1 Output: "ffffffff"题目链接
题意:
给一个int的整型数,需要将其转化为16进制表示的字符串,要求负数用补码来表示。给出了四点注意事项:
- 所有字母a-f全部小写。
- 不允许前置0,除非值为0.
- 所给的数保证在32位int的范围内。
- 不得使用库函数来转换进制。
补码的 有关概念,
百科给出其特点为:
- 一个负整数或原码与其补数相加,和为模。
- 对一个整数的补码再求补码,等于该证书本身。
- 补码的正零与负零表式方法相同。
第一次写的时候采用特点一的思路,拿到num,对其判断是否为负,假如为负,则用ffffffff+1减去该数,注意这里ffffffff应为unsign,并且+1的位置应在减去abs(num)之后。
代码如下:
class Solution {
public:
string totoHex(unsigned num) { // 将unsign转化为hex
char HEX[] = "0123456789abcdef";
string ans;
while (num) {
ans.push_back(HEX[num % 16]);
num /= 16;
}
reverse(ans.begin(), ans.end());
return ans;
}
string toHex(int num) {
unsigned t = num;
if (!num) return "0";
else if (num < 0) {
unsigned temp = 4294967295;
t = temp - abs(num) + 1;
}
return totoHex(t);
}
};
class Solution {
public:
string totoHex(unsigned num) {
char HEX[] = "0123456789abcdef";
string ans;
while (num) {
ans.push_back(HEX[num % 16]);
num /= 16;
}
reverse(ans.begin(), ans.end());
return ans;
}
string toHex(unsigned num) {
return num ? totoHex(num) : "0";
}
};