求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+...的主要内容,如果未能解决你的问题,请参考以下文章
LuoguP3927 SAC E#1 - 一道中档题 Factorial