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;
    }
};