题目:
Given an integer n, count the total number of digit 1 appearing in all non-negative integers less than or equal to n.
For example:
Given n = 13,
Return 6, because digit 1 occurred in the following numbers: 1, 10, 11, 12, 13.
代码:
class Solution {
public:
int countDigitOne(int n) {
int ones = 0;
for (long long m = 1; m <= n; m *= 10) {
ones += (n / m + 8) / 10 * m + (n / m % 10 == 1) * (n % m + 1);
}
return ones;
}
};
提示:
这道题我们先给出代码,在对其进行分析。代码的主体逻辑是从最低位开始向左依次分析。
因为对于每一位,有几种情况需要分开去进行讨论,即:
- 该位大于1:如果大于1,那么在该位出现1的次数为(n / m + 8) / 10 * m
- 该位为0:如果该位是0,那么在上述式子(n / m + 8) / 10 * m中,+8不会产生进位,因此依然可以得到正确的答案
- 该位为1:如果该位是1,那么虽然上述式子依然不会进位,但是我们还需要额外加上低位部分的个数,因此会有:(n / m % 10 == 1) * (n % m + 1)