扩展问题:二进制数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)
编程实现用上述转换的方法即可
归纳得出数学公式如下: