在从1到n的正数中1出现的次数

题目:输入一个整数n,求从1nn个整数的十进制表示中1出现的次数。

例如输入12,从112这些整数中包含1 的数字有11011121一共出现了5次。

http://zhedahht.blog.163.com/blog/static/25411174200732494452636/

24105

我的思路是计算每一位上1会出现在哪些数字中。

建一个数组a[n]放置每一位,从个位到最高位,0~n, 这里n = 4。

a[0]=5,  a[1]=0, a[2]=1, a[3]=4, a[4] = 2. 我们就说第0位是5,第4位是2.

第4位出现1,a[4]>1。则在10000到19999这些数内,也就是出现10^4次.

第3位出现1,a[3]>1。 把24105看成两部分:2    4105,第一部分可能是0~2(也就是0,1,2),第二部分是1000~1999。
所有第4位出现1可能的情况是:
第一部分为0,就是1000~1999。
第一部分为1,11000~11999。
第一部分为2,21000~21999。
所以第4位出现1的次数为3 * 10^3。

第2位出现1,a[2] = 1。24   105,因为a[2] = 1,第一部分要分成两种情况考虑。
第一部分0~23,第二部分100~199。
第一部分23,第二部分100~105。不能超过105,比如24 106就大于24105了。
所以第2位出现1的次数为(24 * 10^2 )+ (105-100 + 1).

第1位出现1,a[1] = 0。241    05。
第一部分0~240,第二部分10~19。
第一部分不能为241了。
所以第1位出现1的次数为241 * 10^1 .

第0位出现1,a[0] = 5。2410    5。
第一部分0~2410,第二部分1。
所以第0位出现1的次数为2411 * 10^0 .

所有加一下就是1出现的次数了。

第i位出现1,a[i]>1, 就直接(第一部分+1)* 10^i。a[i]=1或0,就把 第一部分相等的那种情况另外再考虑。

这道题还可以扩展为数2的个数,或其他数字的个数。区别就是在a[i]<=2(或其他)就要另外考虑了。

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值