求 N!二进制最低位
1 的位置
此问题等同于统计n的阶层末尾
0 的个数
这实际上是求 N!含有质因数 2 的个数。因此答案为含有质因数
2 的个数加 1
分析原因:
(1)因为如果全是奇数,那么其二进制表示最低位肯定是1
(2)每乘以一个2,最低位多一个0
由于 N!中含有质因数 2 的个数 = [N/2] + [N/4] + [N/8] + [N/16] + ...
分析:
如 N = 9,要求 9!质因数 2 的个数
(1)每隔 2 出现一个 2 的倍数的数,共有 [N/2] 个 2 的倍数的数,此时让 N 变成 2 的倍数的数个数,下同
(2)每隔 4 出现一个 4 的倍数的数,也就是说每 2 个 2 的倍数的数出现一个 4,共有 [N/4] = [[N/2] / 2]个 4 的倍数的数
(3)每隔 8 出现一个 8 的倍数的数,也就是说每 2 个 4 的倍数的数出现一个 8,共有 [N/8] = [ [ [N/2] / 2] / 2] 个 8 的倍数的数
要注意:每个 2^x 都包含了前面的每个 2 的次幂的数一次,意味着当计算到某一个数的时候,该数包含的2^x次幂2的个数是最后一个
因此,有如下代码:
int lowestOne(int n) {
int res = 0;
while (n > 0) {
n >>= 1;
res += n;
}
return res;
}