程式設計之美 2 4 「1的數目」

2021-06-09 13:40:33 字數 735 閱讀 8037

擴充套件問題:二進位制數n,從1開始,到n的所有二進位制數,然後數下其中出現的所有「1」的個數。例如:

f(1)=1

f(10)=2 (因為01,10共有2個1)

f(11)=100 (因為01,10,11共有4個1)

思路:以10110為例,考慮最高位為0時共有幾個1,因為後面4位中1和0出現的概率是相等的,也即1在每個位上出現的概率為(2^4)/2=8,最高位為0時,所有1的個數為4*8=32,即f(1111)=32.現在只需計算最高位為1的情況。最高位上出現1的個數的有10000,10001,10010,10011,10100,10101,10110;10110-1111=10110-10000+1=111.最高位為1或不為1時所有1的個數都算完了即f(1111)+10110-10000+1;而後我們只需考慮10110中其他位為1的時候,可以用與最高位同樣的處理方式,10110中除最高位外現只有第三位和第二位的值為1,f(10110)=f(1111)+10110-1111+f(110), f(110)=f(11)+110-11+f(10),f(10)=f(1)+10-1+f(0);

f(10110)=f(1111)+f(11)+f(1)+10110-1111+110-11+10-1+f(0),

f(n個1)=n*2^(n-1)

程式設計實現用上述轉換的方法即可

歸納得出數學公式如下:

程式設計之美2 4 1的數目

總體思路 先求個位上出現的1的個數,再找十位再找百位。先看個位找找規律 5 05 1 1 15 2 1,11 25 3 1,11,21 35 4 1,11,21,31 325 33 1,11,21,31,41,301,311,321 結論 個位上的1的數目s n 10 1 再看十位,找找規律 25 ...

程式設計之美 2 4 1的數目

package code.beauty.fungame public class countone private static int count1inaint int n return num private static void count1inallint int n system.out...

程式設計之美 2 4 1的數目

這道題其實是做過了的,在中 但是再次做還是相當的糟糕。又看了一遍答案。關鍵 要求每一位上1的個數,其任意一位上1的個數受當前位 高位 低位三方面的影響。注意這三位怎麼求,注意資料型別。注意迴圈條件。include long long sum1s unsigned long long n ifacto...