题目描述
求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。
分析
分析1在个位、十位、百位......各个位置上出现的次数
例如从1到213中1出现的次数,对各个位置上1出现的次数进行分析:
个位:21*1 + 1 = 22;
十位:2*10 + (213 - 210+1)=24
百位:0 * 100 + 1 * 100 = 100
所以总的次数为146次。
题解
public class Solution {
public int NumberOf1Between1AndN_Solution(int n) {
int m = 1;
int count = 0;
int temp = n;
while(temp > 0) {
int p = temp % 10;
int q = temp / 10;
count += q * m;
if(p > 1) {
count += m;
} else if(p == 1) {
count += n - temp * m + 1;
}
temp = q;
m *= 10;
}
return count;
}
}
本文介绍了一个高效算法,用于计算任意非负整数区间内数字1出现的总次数。通过分析个位、十位、百位等各位上1出现的规律,提出了一种通用解法,并提供了详细的代码实现。
207

被折叠的 条评论
为什么被折叠?



