编程之美---求N!的二进制表示中最低位1的位置

来源:互联网 发布:印度山地师 知乎 编辑:程序博客网 时间:2024/06/06 08:27

问题描述:

求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
0 0
原创粉丝点击