如何在C语言中实现10、1、A、B这类十六进制数的排序
问题解答
核心认知澄清
你的基础认知没有错误:十六进制中单个字符A对应十进制数值10,B对应十进制数值11。你疑惑的核心原因是忽略了多字符十六进制数的位权规则:
十六进制每一位的位权是16的n次幂(n从右往左从0开始计数),因此双字符的
10作为十六进制数,对应的十进制计算规则为:1 * 16^1 + 0 * 16^0 = 16。
数值大小对比结果:1(十进制1) < A(十进制10) < B(十进制11) < 10(十进制16),正好符合你给出的期望排序结果。
C语言实现思路
你可以按以下步骤实现排序:
- 第一步:将输入的所有十六进制字符串统一转换为十进制整数,可以直接调用C标准库的
strtol函数,指定base参数为16即可完成转换,不需要自行实现解析逻辑 - 第二步:对转换后的十进制整数数组做升序排序,冒泡、快速排序等常规排序算法都可使用
- 第三步:将排序后的整数重新转换为十六进制字符串输出即可
参考代码片段
#include <stdio.h> #include <stdlib.h> #include <string.h> // qsort专用比较函数 int cmp(const void *a, const void *b) { return *(long *)a - *(long *)b; } int main() { char *input[] = {"10", "1", "A", "B"}; int len = sizeof(input)/sizeof(input[0]); long nums[len]; // 十六进制字符串转十进制整数 for(int i=0; i<len; i++) { nums[i] = strtol(input[i], NULL, 16); } // 调用标准库快速排序 qsort(nums, len, sizeof(long), cmp); // 转大写十六进制输出 for(int i=0; i<len; i++) { printf("%lX ", nums[i]); } return 0; }
运行上述代码输出结果为1 A B 10,符合需求。
内容的提问来源于stack exchange,提问作者AKHIL SHARMA
相关产品推荐
相关产品推荐

