进制转换是经典的编程题,尤其是10进制转换为2进制。方法是拿给定的数,不断地除2,将余数放在对应的位置,剩下的数为对应数除2向下取整
[语言月赛 202405] 二进制
题目描述
在介绍十进制转二进制的篇目中,我们总会看到这样的方法:
- 求出这个数字除以 2 2 2 的商和余数,然后将余数写在右侧,用商替换原来的数字;
- 重复以上过程直到这个数字变为 0 0 0;
- 最后将右侧的所有余数倒序排列,得到的就是原数字的二进制形式。
小 S 也在学习二进制,不过她很懒,不想计算那么多次除法。于是她找到了你,希望你能为她写一个程序,帮助她得到上述过程中所有的商和余数。
输入格式
一行,一个正整数 n n n,表示她想要转成二进制的数字。
输出格式
输出若干行,每一行两个数字 x i x_i xi 和 y i y_i yi,表示第 i i i 次除法得到的商和余数。你应该保证 y i y_i yi 是 0 0 0 或 1 1 1。
样例 #1
样例输入 #1
9
样例输出 #1
4 1
2 0
1 0
0 1
样例 #2
样例输入 #2
22
样例输出 #2
11 0
5 1
2 1
1 0
0 1
样例 #3
样例输入 #3
1
样例输出 #3
0 1
提示
样例 1 解释
首先,
9
=
2
×
4
+
1
9 = 2 \times 4 + 1
9=2×4+1,所以第一行输出 4 1
,并令
9
9
9 变为
4
4
4;
然后,
4
=
2
×
2
+
0
4 = 2 \times 2 + 0
4=2×2+0,所以第二行输出 2 0
,并令
4
4
4 变为
2
2
2;
接着,
2
=
2
×
1
+
0
2 = 2 \times 1 + 0
2=2×1+0,所以第三行输出 1 0
,并令
2
2
2 变为
1
1
1;
最后,
1
=
2
×
0
+
1
1 = 2 \times 0 + 1
1=2×0+1,所以第四行输出 0 1
,并令
1
1
1 变为
0
0
0。过程结束。
样例 2 解释
首先,
22
=
2
×
11
+
0
22 = 2 \times 11 + 0
22=2×11+0,所以第一行输出 11 0
,并令
22
22
22 变为
11
11
11;
然后,
11
=
2
×
5
+
1
11 = 2 \times 5 + 1
11=2×5+1,所以第二行输出 5 1
,并令
11
11
11 变为
5
5
5;
接着,
5
=
2
×
2
+
1
5 = 2 \times 2 + 1
5=2×2+1,所以第三行输出 2 1
,并令
5
5
5 变为
2
2
2;
再然后,
2
=
2
×
1
+
0
2 = 2 \times 1 + 0
2=2×1+0,所以第四行输出 1 0
,并令
2
2
2 变为
1
1
1;
最后,
1
=
2
×
0
+
1
1 = 2 \times 0 + 1
1=2×0+1,所以第五行输出 0 1
,并令
1
1
1 变为
0
0
0。过程结束。
数据范围
对于前
30
%
30 \%
30% 的数据,保证
n
n
n 为若干个
2
2
2 的乘积,且
1
≤
n
≤
1
0
9
1 \leq n \leq 10^9
1≤n≤109;
对于另
30
%
30 \%
30% 的数据,保证除法最多只进行
3
3
3 次;
对于
100
%
100 \%
100% 的数据,保证
1
≤
n
≤
1
0
18
1 \leq n \leq 10^{18}
1≤n≤1018。
Scratch实现
接下来我会不断用scratch来实现信奥比赛中的算法题,感兴趣的请关注,我后续将继续分享相关内容