老题新解|十进制转二进制
《信息学奥赛一本通》第160题:十进制转二进制
题目描述
给定一个十进制整数 nnn,请将其转换为对应的二进制表示,并输出。
输入格式
输入包含一行,一个整数 nnn。
输出格式
输出一行,表示整数 nnn 的二进制表示(不含前导零)。
输入输出样例 #1
输入 #1
10
输出 #1
1010
说明/提示
nnn 保证在 int 类型范围内,即 0≤n≤231−10 \leq n \leq 2^{31}-10≤n≤231−1。
输出时不允许有前导零。
数据范围
0≤n≤231−10 \leq n \leq 2^{31}-10≤n≤231−1
提示:n=0n = 0n=0 的情况需要特殊考虑。
大家好,我是莫小特。
这篇文章给大家带来《信息学奥赛一本通》中的第 160 题:十进制转二进制
。
一、题目描述
洛谷的题号是:B2161 十进制转二进制
二、题意分析
这道题是信息学奥赛一本通练习题的第 160 题。
根据输入格式的描述,输入一个整数 n,数据范围:0≤n≤231−10 \leq n \leq 2^{31}-10≤n≤231−1,所以使用 int 类型。
int n;
cin>>n;
输入完成后,我们根据题目意思完成,题目要求我们将输入的十进制数转换为对应的二进制数并输出。
根据二进制的转换规则,需要对输入的数据进行求 2 的余数处理,也就是将余数存储起来,最后倒序输出即可。
使用 while 循环对输入的 n 进行处理,并且还需要建立一个 int 类型的数字,数组元素个数先初始化为 2000,数组下标从 1 开始,所以定义一个变量,初始值为 1。
int a[2000]={0};//初始值为0
int k=1;
while(n!=0)//求到尽头是n==0
{a[k]=n%2;//存储余数n/=2;k++;//下标变化
}
最后输出 a 数组即可,注意要倒序输出,从 k-1 开始到 1。
for(int i=k-1;i>=1;i--)
{cout<<a[i];
}
按照样例输入对数据进行验证。
符合样例输出,到网站提交测评。
有一个错误,注意到提示:n=0 的情况需要特殊考虑。
所以特殊做一个判断。
if(n==0)
{cout<<0;return 0;
}
其他情况就正常输出即可,即加上 else,再次尝试。
测试通过!
三、完整代码
该题的完整代码如下:
四、总结
本题考察了 进制转换与数组倒序输出 的基本操作,主要涵盖以下知识点:
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 的边界输入是否正确处理。
如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注我哦!
如果有更好的方法也可以在评论区评论哦,我都会看哒~
我们下集见~