编程之美_2.4 “1的数目”

来源:互联网 发布:成都编程招聘 编辑:程序博客网 时间:2024/06/05 02:18

扩展问题:二进制数N,从1开始,到N的所有二进制数,然后数下其中出现的所有“1”的个数。例如:

f(1)=1

f(10)=2 (因为01,10共有21)

f(11)=100 (因为01,10,11共有41)

思路:以10110为例,考虑最高位为0时共有几个1,因为后面4位中10出现的概率是相等的,也即1在每个位上出现的概率为(2^4)/2=8,最高位为0时,所有1的个数为4*8=32,即f(1111)=32.现在只需计算最高位为1的情况。最高位上出现1的个数的有10000,10001,10010,10011,10100,10101,1011010110-1111=10110-10000+1=111.最高位为1或不为1时所有1的个数都算完了即f(1111)+10110-10000+1;而后我们只需考虑10110中其他位为1的时候,可以用与最高位同样的处理方式,10110中除最高位外现只有第三位和第二位的值为1f(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)

编程实现用上述转换的方法即可

归纳得出数学公式如下:

 

原创粉丝点击