T609720 十进制转十六进制
题目概述
这道题目要求我们将给定的十进制正整数转换为十六进制表示形式,并使用大写字母A-F表示10-15。十六进制在计算机科学中应用广泛,特别是在内存地址表示、颜色编码等方面。
解题思路
十进制转十六进制的方法与前两题类似,都是通过"除基取余法",但需要注意以下几点特殊之处:
-
十六进制的基数是16,余数范围是0-15
-
余数10-15需要转换为字母A-F表示
-
同样使用栈数据结构来实现余数的逆序输出
参考程序
#include<bits/stdc++.h>
using namespace std;
int q[1001], top = 0; // 定义栈数组q和栈顶指针top
// 定义字符映射数组,将0-15映射为对应的十六进制字符
char vis[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
int main() {
int n;
cin >> n; // 输入十进制数n
// 将十进制数转换为十六进制数的过程
while (n) {
q[++top] = n % 16; // 取n除以16的余数压入栈中
n /= 16; // n更新为除以16的商
}
// 输出十六进制结果
while (top) {
cout << vis[q[top--]]; // 通过映射数组将数字转换为对应字符后输出
}
return 0;
}
代码解析
-
栈的实现:仍然使用数组
q和栈顶指针top模拟栈结构。 -
字符映射:定义了一个字符数组
vis,将数字0-15映射为对应的十六进制字符(0-9,A-F)。 -
转换过程:
-
通过循环不断将十进制数n除以16,并将余数压入栈中
-
当n变为0时,转换过程结束
-
-
输出过程:
-
通过映射数组将栈中的数字转换为对应的十六进制字符
-
按照栈的后进先出特性,依次弹出元素并输出
-
复杂度分析
-
时间复杂度:O(log₁₆n),因为每次循环n都至少减为原来的1/16
-
空间复杂度:O(log₁₆n),栈中存储的十六进制位数与n的十六进制位数相同
示例验证
以题目中的样例为例:
样例1:n=255
-
255 ÷ 16 = 15 余 15 → 栈:[15]
-
15 ÷ 16 = 0 余 15 → 栈:[15,15]
-
弹出顺序:15(F),15(F) → 输出FF
样例2:n=4096
-
4096 ÷ 16 = 256 余 0 → 栈:[0]
-
256 ÷ 16 = 16 余 0 → 栈:[0,0]
-
16 ÷ 16 = 1 余 0 → 栈:[0,0,0]
-
1 ÷ 16 = 0 余 1 → 栈:[0,0,0,1]
-
弹出顺序:1,0,0,0 → 输出1000
总结
通过这三道进制转换题目(二进制、八进制、十六进制),我们可以看到:
-
进制转换的核心算法是相同的:除基取余,逆序排列
-
栈数据结构非常适合解决这类需要逆序输出的问题
-
不同进制的主要区别在于基数和数字表示方式
-
十六进制需要特别注意10-15到A-F的转换

浙公网安备 33010602011771号