题目描述:
主要思路:
寻找1的个数主要分为两个部分:完整的1和取余的1。
完整的1:从个位一直到最高位,例如十位上的1可以出现10次,10-19,然后看他的高位,看看可以出现几轮循环。
取余的1:当前位小于2,就要取低位的个数,如15,十位只能取6次1。
class Solution {
public:
int countDigitOne(int n) {
long long mulk = 1;
int ans=0;
for(int k=0;n>=mulk;++k)
{
ans+=(n/(mulk*10))*mulk+min(max(n%(mulk*10)-mulk+1,0ll),mulk);
mulk*=10;
}
return ans;
}
};