题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。
例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了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(或其他)就要另外考虑了。