1 条题解

  • 0
    @ 2026-6-19 10:30:16

    📝 题目大意

    给定一个 00255255 之间的整数 NN,将其转换为恰好 221616 进制表示(大写字母 A~F),不足两位时在前面补 0

    💡 解题思路

    1. 题目分析NN 的范围很小(0N2550 \leq N \leq 255),即 NN1616 进制下最多 22 位。直接模拟进制转换即可,关键在于处理补零和低位/高位的顺序。

    2. 算法推导

      • 初始化字符数组 a{'0', '0', '0'}(ASCII 码 48),这样当 N=0N = 0 时,a[1]a[2] 默认就是 '0',输出 "00"
      • 使用 while (n != 0) 循环,每次取出 nmod16n \bmod 16 作为当前位 d
        • d < 10,转换为数字字符 d + '0'
        • 否则,转换为大写字母 d - 10 + 'A'
      • 将结果存入 a[++pos],即从下标 1 开始存储(下标 0 为预留的 '0')。
      • 循环结束后,pos 指示实际存储的位数(1122)。由于数组已预填充 '0',未填的位自动保持 '0'
      • 最后输出 a[2](高位)和 a[1](低位),实现两位数补零的效果。
    3. 边界与细节

      • N=0N = 0while 循环不执行,pos 保持 00a[1]a[2] 均为初始值 '0',输出 "00",正确。
      • N<16N < 16:仅产生一位有效数字,存在 a[1]a[2] 为默认 '0',实现前补零。
      • 字母大小写:题目要求使用大写字母 A~F,代码中 'A' 确保了这一点。

    ⏱️ 复杂度分析

    • 时间复杂度O(1)O(1)——NN 最大 255255,进制转换最多 22 次循环。
    • 空间复杂度O(1)O(1)——仅使用固定大小的字符数组。

    💻 标准代码 (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
    上传者