问题描述:
求N!的二进制表示中最低位1的位置。例如:给定N=3,N!=6,那么N!的二进制表示(1010)的最低位1在第二位。
问题求解:
这个问题等同于求N!含有质因数2的个数,因为二进制最低位为0代表是偶数,可以被2整除,如果为1则代表是奇数,不能被2整除,其内部也不会包含质因数2,所以质因数2的个数就是二进制表示中最低位1后面的0个数。
所以,答案等于N!含有质因数2的个数加1 。
N!中含有质因数2的个数,等于[N/2]+[N/4]+[N]/8……
([N/K]等于1,2,3,…,N中能被k整除的数的个数)
#include <iostream>
using namespace std;
int lowestOne(int N)
{
int ret = 0;
while(N)
{
N >>= 1;
ret += N;
}
return ret+1;
}
int main()
{
int N=3;
cout << lowestOne(N) << endl;
return 0;
}
运行结果:
2