http://zhedahht.blog.163.com/blog/static/25411174200732494452636/
思路:
这题是编程之美上面的一道题,同时也是十分考察观察力的一道题,对于数字30142:
1. 对于个位上面的2有2>1,所以个位上面1出现的次数为:(3014 + 1) * 1; (如果前缀为0,所以要加1)
2. 对于十位上面的4有4>1,同样有十位上面1出现的次数为:(301 + 1) * 10;
3. 对于百位上面的1有1=1,此时就要考虑了,前缀变化范围为 0~29,后缀变化范围是0~42,所以此时百位上面1变化的次数为:(30 + 0) * 100 + 43;
4. 对于千位上面的3有3>1,此时千位上面1出现的次数为:(3 + 0) * 1000;
有了上面的分析不难写出程序,并且可以推广到k出现的次数的情况:
int count_number_k(int n, int k) { int base = 1; int pass = 0; int result = 0; while (n > 0) { int rem = n % 10; n /= 10; if (rem > k) result += (n + 1) * base; else if (rem == k) result += n * base + pass + 1; else result += n * base; pass += rem * base; base *= 10; } return result; }