1 条题解

  • 0
    @ 2026-4-12 9:20:31

    十进制转 D 进制(D=2/8/16)

    这道题核心方法:除 D 取余,逆序输出,用栈(stack)刚好完美实现逆序,完全贴合题目要求。

    C++ 满分代码

    #include <iostream>
    #include <stack>
    using namespace std;
    
    int main() {
        long long N;  // 十进制数,支持到 1e9
        int D;        // 目标进制 2/8/16
        cin >> N >> D;
    
        // 特殊情况:输入是 0,直接输出 0
        if (N == 0) {
            cout << 0 << endl;
            return 0;
        }
    
        stack<char> st;  // 用栈存余数,自动逆序
        char ch[] = "0123456789ABCDEF";  // 16 进制字符表
    
        // 除 D 取余
        while (N > 0) {
            int rem = N % D;    // 取余数
            st.push(ch[rem]);   // 余数入栈
            N = N / D;          // 整除
        }
    
        // 出栈 = 逆序输出
        while (!st.empty()) {
            cout << st.top();
            st.pop();
        }
        cout << endl;
    
        return 0;
    }
    

    核心思路

    1. 原理 十进制转任意进制:反复除以 D,记录余数,最后把余数倒过来
    2. 栈的作用 栈是先进后出,刚好把先得到的余数放在底部,最后出栈就是正确顺序
    3. 16 进制处理 余数 10→A,11→B …… 15→F,用字符数组直接映射
    4. 边界 输入 N=0 时,必须直接输出 0,否则会输出空

    测试样例

    输入:

    1348 2
    

    输出:

    10101000100
    

    输入:

    1000 16
    

    输出:

    3E8
    

    总结

    1. 核心:除 D 取余,逆序输出
    2. stack 实现逆序,最符合题目要求
    3. 支持 0、1e9 大数、2/8/16 三种进制,直接提交满分
    • 1

    信息

    ID
    897
    时间
    1000ms
    内存
    16MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者