1 条题解
-
0
📝 题目大意
给定一个 到 之间的整数 ,将其转换为恰好 位的 进制表示(大写字母
A~F),不足两位时在前面补0。💡 解题思路
-
题目分析: 的范围很小(),即 在 进制下最多 位。直接模拟进制转换即可,关键在于处理补零和低位/高位的顺序。
-
算法推导:
- 初始化字符数组
a为{'0', '0', '0'}(ASCII 码48),这样当 时,a[1]和a[2]默认就是'0',输出"00"。 - 使用
while (n != 0)循环,每次取出 作为当前位d:- 若
d < 10,转换为数字字符d + '0'; - 否则,转换为大写字母
d - 10 + 'A'。
- 若
- 将结果存入
a[++pos],即从下标1开始存储(下标0为预留的'0')。 - 循环结束后,
pos指示实际存储的位数( 或 )。由于数组已预填充'0',未填的位自动保持'0'。 - 最后输出
a[2](高位)和a[1](低位),实现两位数补零的效果。
- 初始化字符数组
-
边界与细节:
- :
while循环不执行,pos保持 ,a[1]和a[2]均为初始值'0',输出"00",正确。 - :仅产生一位有效数字,存在
a[1],a[2]为默认'0',实现前补零。 - 字母大小写:题目要求使用大写字母
A~F,代码中'A'确保了这一点。
- :
⏱️ 复杂度分析
- 时间复杂度:—— 最大 ,进制转换最多 次循环。
- 空间复杂度:——仅使用固定大小的字符数组。
💻 标准代码 (C++)
#include <bits/stdc++.h> using namespace std; int n, pos; // 初始化三个字符 '0',a[0]、a[1]、a[2] 默认都是 '0' // 这样当 N=0 或 N<16 时,高位自动补零 char a[15] = {48, 48, 48}; // 48 是 '0' 的 ASCII 码 int main() { scanf("%d", &n); // 模拟短除法,从低位到高位提取 16 进制每一位 while (n != 0) { int d = n % 16; // 当前位的值(0~15) if (d < 10) a[++pos] = d + '0'; // 0~9 → 数字字符 else a[++pos] = d - 10 + 'A'; // 10~15 → 大写字母 A~F n /= 16; // 去掉已处理的最低位 } // 输出高位在前、低位在后,恰好两位(不足时高位为预置的 '0') printf("%c%c", a[2], a[1]); return 0; } -
- 1
信息
- ID
- 638
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者