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

扩展问题:二进制数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)

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

归纳得出数学公式如下:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值