《编程之美》中不要被阶乘吓倒的一个注解
这一节中的第二个问题:求N!的二进制表示中最低位1的位置。其中第二个解法提出N!含有质因数2的个数等于N减去N的二进制表示中1的数目,不过没有给出证明,自己推导了一下,如下所示。
假设N=anan-1...a1a0,其中ai属于{0, 1},an=1。由于N!中含有质因数2的个数为
[N/2] + [N/4] + [N/8] + [N/16] + ...
=anan-1...a1 + anan-1...a2 + ... + anan-1 + an = S (1)
以上式子两边同时乘以2,得到
anan-1...a10 + anan-1...a20 + ... + anan-10 + an0 + 0 = 2S (2)
(2) - (1)错位减,得到:
anan-1...a10 - a1 - a2 - ... - an=S
整理得到
N-(a0 + a1 + a2 + ... + an) = S
注意到ai属于{0, 1},因此就得到证明。