完美解决微软求N包含1的个数

完美解决微软求N包含1的个数

Benkong  2009-6-17

 

//问题描述

//设函数F(n),其中 n ~ (0, 2^32-1)

//为统计0 ~ n的所有整数所包含的1 的个数之和。

 

1 找规律:快速求出0-10^(n)-1之间1的个数

0-9              N1   1

 

00-99    N2=10*N1+10

不考虑最高位的情况

00-09

10-19

20-29

90-99

个位数1的个数 10*N1 

最高位1的个数 10-19  10

结论:1的个数 N2=10*N1+10

 

000-999    10*N1+10

不考虑最高位1的个数

000-099

100-199   

200-299   

….

900-999   

总个数为 10*N2

最高位1的个数 100-199  100

结论: 1的个数 N2=10*N2+100

 

归纳:

000…0-999…9 n9

结论: 1的个数 Nn=10*N(n-1)+10^(n-1)

 

 

2 分析一个具体数 5467

0000-5000的个数

n=5(最高位数)

先不考虑最高位1的情况

0000-0999

1000-1999

2000-2999

3000-3999

4000-4999

1的个数位n*N3

再考虑最高位1的个数

n>1,则包含1的个数位1000-1999  1000

n=1,则包含1的个数位后面的3位数+1 1000-1 XXX。如1324; 1的个数位325

n=0,则包含1的个数为0  0234,实际上退化为3位数。

 

再考虑百位数

n=4,分析同上

先不考虑最高位1的情况

000-099

100-199

200-299

300-399

1的个数位n*N2

再考虑最高位1的个数

n>1,则包含1的个数位100-199  100

n=1,则包含1的个数位后面的2位数+1 100-1 XX。如132; 1的个数位33

n=0,则包含1的个数为0  5034

 

再考虑10位数

分析完全同上

 

最后考虑个位数

若该各位>0,则必定包含1否则为0

 

归纳N位数中任意一位x(各位除外)

***x**** x后面有n位数(n>1)

x包含1的个数为

 

x>1,则包含1的个数为:p=10^n

x=1,则包含1的个数为:p=后面的2位数+1

x=0,则包含1的个数为:p=0

 

x包含1的个数=X*Nn+P

 

 

测试代码如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值