carloscn / structstudy

Leetcode daily trainning by using C/C++/RUST programming.
4 stars 1 forks source link

leetcode405:数字转换为十六进制数(convert-a-number-to-hexadecimal) #92

Open carloscn opened 1 year ago

carloscn commented 1 year ago

问题分析

给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。

注意:

十六进制中所有字母(a-f)都必须是小写。 十六进制字符串中不能包含多余的前导零。如果要转化的数为0,那么以单个字符'0'来表示;对于其他情况,十六进制字符串中的第一个字符将不会是0字符。  给定的数确保在32位有符号整数范围内。 不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。

示例 1: 输入: 26

输出: "1a"

示例 2: 输入: -1

输出: "ffffffff"

来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/convert-a-number-to-hexadecimal

carloscn commented 1 year ago

问题分析

直接除16,反向取余。

如52转换成16进制。52/16=3……4,余数为4;接着3/16=0……3。所以转换的结果为34H。

image

static char str_rom[100] = {0};

static char dec_2_hex(int32_t e)
{
    if (e < 10) {
        return e + '0';
    } else if (e >= 10 || e < 16) {
        return e + 'a' - 10;
    } else {
        return '0';
    }
}

static char* to_hex(int32_t e)
{
    size_t i = 0, j = 0;
    uint32_t m = e;

    if (m == 0) {
        str_rom[0] = '0';
        str_rom[1] = '\0';
        return str_rom;
    }

    while (m) {
        str_rom[i ++] = dec_2_hex(m & 15);
        m /= 16;
    }

    for (j = 0; j < i / 2; j ++) {
        utils_swap_char(str_rom + j, str_rom + i - j - 1);
    }

    str_rom[i] = '\0';

    return str_rom;
}
carloscn commented 1 year ago

code

https://github.com/carloscn/structstudy/blob/master/c_programming/str/24_convert-a-number-to-hexadecimal_405.c

result

image