求出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); }