说实话,我自己没做出来,看了一下别人的代码,思路跟我差不多,也是用二进制
以137为例,二进制是10001001
题目实际上就是把n拆成二进制中每个1对应的指数相加,如下图
下面是网上的代码
下面解释一下这段代码
根据样例输出,输出2的1次方时直接输出2,输出2的0次方时输出2(0)
因此递归函数中直接把这两个特例当作递归结束条件
然后用while循环不断让1左移,让其超出n,来探测最大1出现在哪里
1<<0就是2的0次方
1<<3就是2的3次方
1<<7就是2的7次方
比如137,while循环如下图,最终指数e=8,对应2的8次方=256>137
此时是超出n的,所以还需要让e--,让其回到最大1的位置,指数e=7
最后输出时
只有2的1次方是特例,所以需要让e==1时输出2
其他就是正常输出:
以137为例,循环完成并自减后e==7
输出2( )+,括号里面对指数e再进行分解,仍是递归调用divide,探测其二进制中1的位置
2的7次方输出完成后,将其减去,即n - (1 << e),然后让剩余部分递归调用divide