質疑 程式設計之美求N 的二進位制最低位1的位置的問題

2022-03-16 02:22:23 字數 1045 閱讀 9270

引子:程式設計之美給出了

求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,很簡單。但從執行效率來...