给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。
示例 1:
输入:n = 13
输出:6
示例 2:
输入:n = 0
输出:0
解题思路
1:首先数个位上1的个数,以n=231~239为例,则有 (n/10+1)*1 个1;而对于n=230,则有(n/10)*1 个1。
1
11
21
...
221
231
2:其次数十位上1出现的个数,当十位上数字大于1时,以n=232为例,固定十位为1,则有以下(n/100+1)*10 种情况;
10 110 210
11 111 211
... ... ...
19 110 219
当十位上数字等于1时,以n=212为例,固定十位为1,则有以下(n/100)*10+(n%10+1) 种情况:
10 110 210
11 111 211
... ... 212
19 119
当十位上数字等于0时,以n=202为例,固定十位为1,则有(n/100)*10 种情况.
计算百位、千位、万位...上1出现的个数同理。
class Solution {
public:
int countDigitOne(int n) {
int k = 0;
int L = n;
long long scale = 1;
while( n/scale != 0)
{
if( L%10 > 1)
k += scale * (n/(scale*10) + 1);
else if( L%10 == 1)
k += scale * ( n/(scale*10)) + (n%scale + 1);
else
k += scale * (n/(scale*10));
L = L/10;
scale = scale * 10;
}
return k;
}
};