Java 实现整数中1出现的次数(从1到n整数中1出现的次数)

求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。

代码

    public static long calAllAppearSumOfk(int left, int right, int k) {
        int start = 0;
        int end = 0;
        if (left < right) {
            start = left;
            end = right;
        } else {
            start = right;
            end = left;
        }
        long sum = 0;
        for (int i = start; i <= end; i++) {
            sum += calAppearSumOfk(i, k);
        }
        return sum;
    }

    private static int calAppearSumOfk(int n, int k) {
        int sum = 0;
        // 通过求余求除来计算k出现的次数
        // k在 [1, 9] 之间,所以用10作为基数
        // 对10求余,来获得个位数的数值,比如 11 % 10 = 1, 121 % 10 = 1
        // 对10求除,来消除已经计算过的个数位,比如 11 / 10 = 1, 121 / 10 = 12
        while (n > 0) {
            // 对10求余,如果余数等于k,则说明个位上出现k
            if (n % 10 == k) {
                sum++;
            }
            // 除以10,并保存结果,去除当前个位,当n==0时结束
            n /= 10;
        }
        return sum;
    }

    public static void main(String[] args) {
        long sum = calAllAppearSumOfk(1, 13, 1);
        System.out.print(sum);
    }

你可能感兴趣的:(剑指offer算法,剑指offer算法(Java))