zoukankan      html  css  js  c++  java
  • 数据结构练习(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;
    }
    -------------------------------------------------------

    kedebug

    Department of Computer Science and Engineering,

    Shanghai Jiao Tong University

    E-mail: kedebug0@gmail.com

    GitHub: http://github.com/kedebug

    -------------------------------------------------------

  • 相关阅读:
    内部类
    多重继承关系初始化顺序及初始化
    String
    Error
    算法:插入排序
    算法:冒泡排序
    算法:选择排序
    注册Activity
    java变量的作用域和基本数据类型转换
    java数据类型
  • 原文地址:https://www.cnblogs.com/kedebug/p/2829911.html
Copyright © 2011-2022 走看看