《信息学奥赛一本通》第160题:十进制转二进制
题目描述
给定一个十进制整数 n nn,请将其转换为对应的二进制表示,并输出。
输入格式
输入包含一行,一个整数 n nn。
输出格式
输出一行,表示整数 n nn 的二进制表示(不含前导零)。
输入输出样例 #1
输入 #1
10
输出 #1
1010
说明/提示
n nn 保证在 int 类型范围内,即 0 ≤ n ≤ 2 31 − 1 0 \leq n \leq 2^{31}-10≤n≤231−1。
输出时不允许有前导零。
数据范围
0 ≤ n ≤ 2 31 − 1 0 \leq n \leq 2^{31}-10≤n≤231−1
提示: n = 0 n = 0n=0 的情况需要特殊考虑。
大家好,我是莫小特。
这篇文章给大家带来《信息学奥赛一本通》中的第 160 题:十进制转二进制
。

一、题目描述
洛谷的题号是:B2161 十进制转二进制

二、题意分析
这道题是信息学奥赛一本通练习题的第 160 题。
根据输入格式的描述,输入一个整数 n,数据范围: 0 ≤ n ≤ 2 31 − 1 0 \leq n \leq 2^{31}-10≤n≤231−1,所以使用 int 类型。
1int n; 2cin>>n; 3
输入完成后,我们根据题目意思完成,题目要求我们将输入的十进制数转换为对应的二进制数并输出。
根据二进制的转换规则,需要对输入的数据进行求 2 的余数处理,也就是将余数存储起来,最后倒序输出即可。
使用 while 循环对输入的 n 进行处理,并且还需要建立一个 int 类型的数字,数组元素个数先初始化为 2000,数组下标从 1 开始,所以定义一个变量,初始值为 1。
1int a[2000]={0};//初始值为0 2int k=1; 3while(n!=0)//求到尽头是n==0 4{ 5 a[k]=n%2;//存储余数 6 n/=2; 7 k++;//下标变化 8} 9
最后输出 a 数组即可,注意要倒序输出,从 k-1 开始到 1。
1for(int i=k-1;i>=1;i--) 2{ 3 cout<<a[i]; 4} 5
按照样例输入对数据进行验证。

符合样例输出,到网站提交测评。

有一个错误,注意到提示:n=0 的情况需要特殊考虑。
所以特殊做一个判断。
1if(n==0) 2{ 3 cout<<0; 4 return 0; 5} 6
其他情况就正常输出即可,即加上 else,再次尝试。

测试通过!
三、完整代码
该题的完整代码如下:
1 2
四、总结
本题考察了 进制转换与数组倒序输出 的基本操作,主要涵盖以下知识点:
1、十进制转二进制的算法原理:不断对 2 取余并整除 2。
2、数组或字符串的逆序输出技巧:先存储再倒序输出。
3、特殊输入处理:当 n=0 时需单独输出“0”,否则结果为空。
知识点总结
(1)利用 %2 获取当前位的二进制值,利用 /2 逐步缩小 n,实现除二取余法。
(2)数组下标的使用要注意从 1 开始存储余数,最后从 k-1 递减输出。
(3)特殊值 n=0 是常见边界测试点,需要单独判断,否则不会输出任何内容。
常见易错点
(1)忘记处理 n=0 的情况,导致输出为空。
(2)输出顺序写反(从前往后输出),会得到错误的二进制结果。
(3)数组越界或下标起始错误(如从 0 开始)可能导致最后一位缺失。
(4)输出结果时不应出现前导零。
解题建议
(1)建议先用手算几组数据,理解“除二取余、反向输出”的逻辑。
(2)提交前务必检查 n=0 的边界输入是否正确处理。
---end---
如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注我哦!
如果有更好的方法也可以在评论区评论哦,我都会看哒~
我们下集见~
《老题新解|十进制转二进制》 是转载文章,点击查看原文。
