数据结构练习(45)在从1到n的正数中1出现的次数

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;
}

 

posted @ 2012-12-23 14:12  kedebug  阅读(252)  评论(0编辑  收藏  举报