class Solution { public: int NumberOf1Between1AndN_Solution(int n) { if(n<=0) return 0; int count=0; int ret=0; int temp=n; while(temp){ temp/=10; count++; } // pow(10,exponent-1)*exponent; int e=0; int a=0,b=n; while(count--){ a=b%10;//a记录每一位的数,从最低位开始 b=b/10;//b记录剩下的数, //个位含1数,写入。。十位含1数,写入..依次... if(a>1) ret+=pow(10,e-1)*e*a+pow(10,e); else if(a==0) {} else { int index=pow(10,e); ret+=pow(10,e-1)*e*a+n%index+1; } e++; } return ret; // int cnt = 0; // for(int m = 1; m <= n; m *= 10) { // int a = n / m, b = n % m; // cnt += (a + 8) / 10 * m + (a % 10 == 1 ? b + 1 : 0); // } // return cnt; // int NumberOf1Between1AndN_Solution(int n) { // if(n<=0) return 0; // int num=0; // int i=n; // while(i){ // if(i%10==1) // num++; // i/=10; // } // num+=NumberOf1Between1AndN_Solution(n-1); // return num; // int Count(string s){ // int num=0; // for(auto &e:s){ // if(e=='1') // num++; // } // return num; // } // int NumberOf1Between1AndN_Solution(int n) { // int ret=0; // for(int i=1;i<=n;i++){ // ret+=Count(to_string(i)); // } // return ret; /* if(n<=0) return 0; int ret=0; for(int i=1;i<=n;i++){//遍历每个数 int temp=i; while(temp){//循环拆分判断个位是否有1,直到数为0; if(temp%10==1) ret++; temp/=10; } } return ret; */ } };