// 找规律
// 当前位是0 1 或者2-9之间的数时,1出现的次数
class Solution {
public:
// 拿2304举例,假设当前位是0,即十位
// cur=0 high=23 low=4 digit=10
// 出现1的可能是0000~2219 次数是229-000+1=230 high*10
// 拿2314举例,当前位是1
// cur=1 high=23 low=4 digit=10
// 出现1的可能是0000~2314 次数是234-000+1=235 high*10+low+1
// 拿2324举例,当前位是2
// cur=1 high=23 low=4 digit=10
// 出现1的可能是0000~2319 次数是239-000+1=240 (high+1)*10
int countDigitOne(int n) {
// base case
int high=n/10,cur=n%10,low=0;
long digit=1;
int res=0;
while(high!=0 || cur!=0){ // high与cur都为0才退出循环
if(cur==0){
res+=high*digit;
}
else if(cur==1){
res+=high*digit+low+1;
}
else
res+=(high+1)*digit;
low+=cur*digit;
cur=high%10;
high/=10;
digit*=10;
}
return res;
}
};