Java实现“从1到N的所有整数中1出现的个数”

本文详细介绍了如何用Java计算从1到N的所有整数中数字1出现的次数。通过按位分析,分别考虑当前位大于等于1和小于1的情况,并以2048为例进行解释,最后提供了算法实现思路。

首先要明确题意:是1出现的个数,而不是包含1的整数的个数;

其次:分情况进行讨论

(1)大框架是按位进行置1,去讨论除本位之外的情况(比如,个位置为1,分析十百千位的情况)

(2)考虑当前位,若当前位大于等于1,则左边位可以取到最大值;否则,最高位取到(最大值-1);

(3)考虑最高位,若最高位大于等于1,则可以取完;否则,最高位取到本数的最大值;

最后,当然得来个例子才好:

         上面是我自己总结的,可能直接看不是很能理解,贴心的用下面一个例子来进行阐述:

         比如,2048,先看个位,个位置1,当前位8>1,所以左边可以从0-204,也就是205;

         十位为1,当前位4>1,左边位可以从0-20全取完,右边位也可以全取完0-9(左边不会超过最大值,右边位一定可以全部取完,因此右边可以全部取完),则是21*10=210;

         百位置1,当前位为0<1,则左边位只能取0-1,,不能取2,右边位可以全部取完,也就是2*100=200个;

         千位置1,千位是这个数的最高位,且2>1,所以可以取1000-1999全部取完,就是1000个(若是1048,千位置1,就只能取到1000-1048);所以总数就是205+210+200+1000=1615;可以经过代码进行验证。

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值