求X=N/2+N/4+N/8+N/16+...

Posted xrst

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求X=N/2+N/4+N/8+N/16+...相关的知识,希望对你有一定的参考价值。

公式中的N是自然数,除法是整数除法(向下取整)。

这个公式是从《编程之美》阶乘一章摘来的,除了硬算之外,里面给出了另一个答案:X=N-(N的二进制表示中1的数目)。

但是书中用11011为例证明这个结论太复杂了,看不懂,我想了另外一个解读:

N

= (N的二进制最低位 + N/2) + N/2

= (N的二进制最低位 + N/2) + (N/2的二进制最低位 + N/4) + N/4

...

= (N的二进制最低位 + N/2的二进制最低位 + ...) + (N/2 + N/4 + ...)

= N的二进制中1的个数 + X

求1的个数在书上也介绍了O(1)的查表法,即使对于int32也成立(拆成4个字节查4次表)。因此这种方法比起硬算的O(log n)稍微快些。

以上是关于求X=N/2+N/4+N/8+N/16+...的主要内容,如果未能解决你的问题,请参考以下文章

2的幂

LuoguP3927 SAC E#1 - 一道中档题 Factorial

如何求解:T(n) = T(n/2) + T(n/4) + T(n/8) + (n)

NEFU 118 n!后面有多少个0数论

HDU多校第一场

问题总结