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