给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。
示例:
输入: 13
输出: 6
解释: 数字 1 出现在以下数字中: 1, 10, 11, 12, 13 。
分别计算在个十百千。。。位上1出现的次数
在某个位置上如果是0,那么1出现的次数=它的高位x它的位数
如果某个位置上是1,那么1出现的次数=它的高位x它的位数+它的低位数字+1
如果某个位置上的数字大于1,那么1出现的次数=(它的高位数字+1)x它的位数
比如说102
十位是0,十位出现1的情况是10——19,共10个
112
十位是1,十位出现1的情况是10——19,110——112,共1*10+2+1=13个
122
十位是2,十位出现1的情况是10——19,110——119,共(1+1)*10=20个
class Solution {
public:
int countDigitOne(int n) {
if(n <= 0) return 0;
int num = n;
//记录当前位置的位数
int mul = 1;
int sum = 0;
while(num)
{
//如果当前位置是0
if(num % 10 == 0)
sum = sum + (num / 10) * mul;
//当前位置是1
else if(num % 10 == 1)
sum = sum + ((num / 10) * mul + (n % mul) + 1);
//当前位置>1
else
sum = sum + ((num / 10) + 1) * mul;
num = num / 10;
//防止溢出
if(!num) break;
mul = mul * 10;
}
return sum;
}
};