《编程之美》中不要被阶乘吓倒的一个注解

这一节中的第二个问题:求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},因此就得到证明。