T609713 【栈模板】十进制转二进制
题目概述
这道题目要求我们将给定的十进制正整数转换为二进制表示形式。这是一个非常基础但重要的计算机科学问题,涉及到计算机内部数据表示的基本原理。
解题思路
十进制转二进制的基本方法是通过"除2取余法",具体步骤如下:
-
将十进制数不断除以2,记录每次的余数(0或1)
-
将得到的余数按逆序排列,就是对应的二进制表示
-
使用栈数据结构可以很自然地实现这种"后进先出"的需求
参考程序
#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 % 2; // 取n除以2的余数压入栈中 n /= 2; // n更新为除以2的商 } // 输出二进制结果 while(top != 0) { cout << q[top--]; // 从栈顶开始依次弹出元素,实现逆序输出 } return 0; }
代码解析
-
栈的实现:这里使用数组
q
和栈顶指针top
模拟了一个栈结构。q[++top] = n%2
实现了压栈操作,q[top--]
实现了弹栈操作。 -
转换过程:
-
通过循环不断将十进制数n除以2,并将余数压入栈中
-
当n变为0时,转换过程结束
-
-
输出过程:
-
按照栈的后进先出特性,依次弹出元素并输出
-
这样自然实现了余数的逆序排列,得到正确的二进制表示
-
复杂度分析
-
时间复杂度:O(log₂n),因为每次循环n都至少减半
-
空间复杂度:O(log₂n),栈中存储的二进制位数与n的二进制位数相同
示例验证
以题目中的样例1为例,n=10:
-
10 ÷ 2 = 5 余 0 → 栈:[0]
-
5 ÷ 2 = 2 余 1 → 栈:[0,1]
-
2 ÷ 2 = 1 余 0 → 栈:[0,1,0]
-
1 ÷ 2 = 0 余 1 → 栈:[0,1,0,1]
-
弹出顺序:1,0,1,0 → 输出1010