题目
July 7, 2021 · View on GitHub
输入一个整数 n,求从 1 到 n 这 n 个整数的十进制表示中 1 出现的次数。
例如输入 12,从 1 到 12 这些整数中包含 “1” 的数字有 1,10,11 和 12,其中 “1” 一共出现了 5 次。
样例
输入: 12
输出: 5
参考答案
class Solution {
public:
int numberOf1Between1AndN_Solution(int n) {
int count = 0;
for (int i = 1; i <= n; i *= 10) {
int a = n / i,b = n % i;
//之所以补8,是因为当百位为0,则a/10==(a+8)/10,
//当百位>=2,补8会产生进位位,效果等同于(a/10+1)
count += (a + 8) / 10 * i + ((a % 10 == 1) ? b + 1 : 0);
}
return count;
}
};
//总结一下以上的算法,可以看到,当计算右数第 i 位包含的 X 的个数时:
//取第 i 位左边(高位)的数字,乘以 10i−1,得到基础值 a。
//取第 i 位数字,计算修正值:
//如果大于 X,则结果为 a+10i−1。
//如果小于 X,则结果为 a。
//如果等 X,则取第 i 位右边(低位)数字,设为 b,最后结果为 a+b+1。