T609719 十进制转八进制

题目概述

这道题目要求我们将给定的十进制正整数转换为八进制表示形式。八进制在计算机科学中也有一定应用,特别是在一些早期的系统中。理解进制转换的原理对于掌握计算机底层知识非常重要。

解题思路

十进制转八进制的方法与转二进制类似,都是通过"除基取余法",具体步骤如下:

  1. 将十进制数不断除以8,记录每次的余数(0-7)

  2. 将得到的余数按逆序排列,就是对应的八进制表示

  3. 使用栈数据结构可以很自然地实现这种"后进先出"的需求

参考代码

#include<bits/stdc++.h>
using namespace std;

int q[105], top; // 定义一个数组q作为栈,top表示栈顶指针

int main() {
    int n; 
    cin >> n; // 输入十进制数n
    
    // 将十进制数转换为八进制数的过程
    while(n != 0) {
        q[++top] = n % 8; // 取n除以8的余数压入栈中
        n /= 8;           // n更新为除以8的商
    } 
    
    // 输出八进制结果
    while(top != 0) {
        cout << q[top--]; // 从栈顶开始依次弹出元素,实现逆序输出
    }
    
    return 0;
}

代码解析

  1. 栈的实现:与二进制转换类似,使用数组q和栈顶指针top模拟栈结构。q[++top] = n%8实现压栈,q[top--]实现弹栈。

  2. 转换过程

    • 通过循环不断将十进制数n除以8,并将余数压入栈中

    • 当n变为0时,转换过程结束

  3. 输出过程

    • 按照栈的后进先出特性,依次弹出元素并输出

    • 这样自然实现了余数的逆序排列,得到正确的八进制表示

复杂度分析

  • 时间复杂度:O(log₈n),因为每次循环n都至少减为原来的1/8

  • 空间复杂度:O(log₈n),栈中存储的八进制位数与n的八进制位数相同

示例验证

以题目中的样例为例:

样例1:n=100

  1. 100 ÷ 8 = 12 余 4 → 栈:[4]

  2. 12 ÷ 8 = 1 余 4 → 栈:[4,4]

  3. 1 ÷ 8 = 0 余 1 → 栈:[4,4,1]

  4. 弹出顺序:1,4,4 → 输出144

样例2:n=512

  1. 512 ÷ 8 = 64 余 0 → 栈:[0]

  2. 64 ÷ 8 = 8 余 0 → 栈:[0,0]

  3. 8 ÷ 8 = 1 余 0 → 栈:[0,0,0]

  4. 1 ÷ 8 = 0 余 1 → 栈:[0,0,0,1]

  5. 弹出顺序:1,0,0,0 → 输出1000

posted @ 2025-05-21 14:44  行胜于言Ibl  阅读(126)  评论(0)    收藏  举报