题意
给出一个数字 nnn,求 111~nnn 范围内,有多少数字的二进制表示是回文的。
解析
这里讲解重点部分。
1. 二进制表示
在本题中,得到数字二进制可以有两种方法:十进制转二进制和二进制自增。
方法 1:十进制转二进制
十进制转换成二进制通常是利用短除法,依次除以 222 取余数,再把余数反向拼接得到。例如 151515,它转换成二进制的过程是这样的:
所以,(15)10=(1111)2(15)_{10}=(1111)_{2}(15)10 =(1111)2 。
参考代码:
方法 2:二进制自增
定义 string 类型的变量 bin,存储数字的二进制表示,初始化为 "0"。
然后,先自增,再判断,如果 bin 是回文的,那么答案加 111。
首先是自增。二进制自增可以这样做:
观察下面这个二进制数:
(10100111)2(10100111)_{2} (10100111)2
这个数加 111 后的值应该是:
(10101000)2(10101000)_{2} (10101000)2
那么,我们就可以得到二进制自增的方法:
· 找到最右边的 000,将它修改为 111。
(10101111)2(1010\textcolor{lightgreen}{1}111)_{2} (10101111)2
· 然后将这个 000 右边的所有 111 修改为 000。(当然,如果这个 000 是最右边的一位就可以忽略这一步)
(10101000)2(10101\textcolor{lightgreen}{000})_{2} (10101000)2
但是还有一种特殊情况。例如:
(111111)2(111111)_{2} (111111)2
可以发现这里面并没有 000。所以,我们需要将所有位都修改为 000。
(000000)2(\textcolor{lightgreen}{000000})_{2} (000000)2
再在最高位加入 111。
(1000000)2(\textcolor{lightgreen}{1}000000)_{2} (1000000)2
这样,也成功处理了这种特殊情况。
参考代码:
然后就是判断了。判断很简单,双指针从两边到中间遍历即可。
参考代码:
代码
这里展示的代码对于处理二进制采用的是二进制自增。
后记
可以点个赞吗