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