引子:程式設計之美給出了
求n!的二進位制最低位1的位置的二種思路,但是呢?但是呢?不信你仔細聽我道來。
1、程式設計之美一書給出的解決思路
問題的目標是n!的二進位制表示中最低位1的位置。給定乙個整數n,求n!二進位制表示的最低位1在第幾位?例如:給定n = 3,n!= 6,那麼n!的二進位制表示(1 010)的最低位1在第二位。
為了得到更好的解法,首先要對題目進行一下轉化。
首先來看一下乙個二進位制數除以2的計算過程和結果是怎樣的。
把乙個二進位制數除以2,實際過程如下:
判斷最後乙個二進位制位是否為0,若為0,則將此二進位制數右移一位,即為商值(為什麼);反之,若為1,則說明這個二進位制數是奇數,無法被2整除(這又是為什麼)。
所以,這個問題實際上等同於求n!含有質因數2的個數+1。即答案等於n!含有質因數2的個數加1
。 實際上n!都為偶數,因為質因數裡面都有乙個2,除了1以外,因為1的階乘是1,是個奇數,其他數的階乘都是偶數。
2、程式設計實現
(1)書中提到的解決方案一:
1int
factlastbinaryone(
intn)2 9
return count+1;
10 }
(2)書中提到的解決方案二:
貼上計算數的二進位制表示1的個數的計算方法:
1int
bitcount(
intvalue)2 9
return count;
10 }
則其計算方法是n - bitcount(n!)+1。
3、我們看看測試用例以及測試結果
1int
main()
2 看看執行結果:
注意答案不一樣哦,但估計是我錯了,請各位園友幫我指正一下,共同學習,共同進步。
程式設計之美 求二進位制中1的個數
1.問題描述 實現乙個函式,輸入乙個無符號整數,輸出該數二進位制中的1的個數。例如把9表示成二進位制是1001,有2位是1,因此如果輸入9,該函式輸出2 2.分析與解法解法1 利用十進位制和二進位制相互轉化的規則,依次除餘操作的結果是否為1 如下 int count1 unsigned int v ...
求二進位制數中1的個數 《程式設計之美》
求二進位制中1的個數。對於乙個位元組 8bit 的變數,求其二進位制表示中 1 的個數,要求演算法的執行效率盡可能的高。先來看看樣章上給出的幾個演算法 解法一 每次除二,看是否為奇數,是的話就累計加一,最後這個結果就是二進位制表示中1的個數。解法二 同樣用到乙個迴圈,只是裡面的操作用位移操作簡化了。...
程式設計之美 求二進位制數中1的個數
題目 對於乙個位元組的無符號整型變數,求其二進位制表示中 1 的個數,要求演算法的執行效率盡可能高。題目很簡單,一般人都可以用最直接的方法求解出來,通過求餘和模除運算。對二進位制操作過程中,除以乙個2,原來的數就會少乙個0,如果除過程中余1,則表示當前位置有乙個1,計數值加1,很簡單。但從執行效率來...