1. 程式人生 > >程式設計之美---求N!的二進位制表示中最低位1的位置

程式設計之美---求N!的二進位制表示中最低位1的位置

問題描述:

求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