题目来源于《编程之美》上的一道题。第2.2节“不要被阶乘吓到”中提出了一个问题“求N!的二进制表示中最低位1的位置”。这个题目理解起来比较简单,就等价于求N!中质因子2的个数。因为N!中有几个质因子2,就表示N!的二进制表示可以往右移动几位而不丢失最低位的1。而N!中所含的质因子2的个数可以表示为:
所以容易得出如下解法:
解法一:
int lowestOne(int n)
{
int Ret = 0;
while(n)
{
n>>=1;
Ret += n;
}
return Ret;
}
代码来自《编程之美》。
解法二:
N!所含质因子2的个数等于N减去N的二进制表示中1的数目。
下