求一个数字中1的个数

输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。

如18出现了1 10 11 12 13 14 15 16 17 18 总计10次 

 例如一个5位数x=48292

 万位数  10000-19999共有10000个

 千位数  5*(1000)此时万位数的取值可以是0 1 2 3 4 共5个所以有5种

 百位数  00100-48292 共有100*49

  十位数 00010-48292 共有482*10

 个位数4830*1

总计10000+5000+4900+4820+4830

规律

c >1: 00 1 00 -- ab 1 99,共计 (ab+1)*100种,其中(ab+1)表示万千位可以取00-ab,共计ab+1种。因为c>1所以 ab199<abcde,所以这些数都是在1 -- abcde范围内。

 

c=0:  00 1 00 -- a (b-1) 1 99, 总共有ab*100种,而a(b-1)200-ab099之间,都没有百位=1的数字出现了。

 

c=1:  我们可以把c = 1的数字分成以下2种情况之和

 

             00 1 00 -- a(b-1)1 99 :总共ab * 100种可能性;

 

a(b-1) 2 00 -- ab 0 99:这段数字中百位=1的的数字数目为0;

 

              ab 1 00 -- ab 1 cd:共计cd+1种可能性;

 

所以c =1的数字数目,等于c=0的数字数目,加上abcde%100 +1。

 

转载于:https://www.cnblogs.com/masimian/p/4552829.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值