class Solution {
public:
int NumberOf1Between1AndN_Solution(int n)
{
int nums = 0;
int m = 1;
int lnum = 0, rnum = 0, mnum = 0;
//按某位填1来算,如果那位真实值大于1,那么填1的所有情况都满足小于n
//m为1,10,100...
while(m <= n)
{
rnum = n % m;//当前位置右侧的数值
mnum = n / m % 10;//当前位置数值
lnum = n / m / 10;//当前位左侧数值
//若当前数大于1,那么左侧的数从0到lnum(lnum+1)个都随便取,当前位置取1,右侧(m个)也随便取。
//若当前==1,左侧则不能随便取(仅能取0到lnum-1,lnum个配上右侧随便,或左侧取lnum右侧取rnum内(rnum+1)个)
//若当前小于1,当前置为1后,左侧只能取0到lnum-1,右侧随便取m个
if(mnum > 1) nums += (lnum + 1 )* m;
else if(mnum == 1) nums += (lnum * m) + (rnum + 1);
else{
nums += lnum * m;
}
m *= 10;
}
return nums;
}
};