这题O(logn)算法真不好弄啊……
参考:
https://blog.csdn.net/huzhigenlaohu/article/details/51779365
反正分两种情况吧:
- 当前位 == X 或者不等于X
- 不等于X时,大于X 进位;
- 等于X,加上低位+1;
a = n / i, b = n%i ;
当前位: a%10
前半部分 : a/10 , 基数 i
后半部分: b
class Solution {
public:
int NumberOf1Between1AndN_Solution(int n)
{
int ans =0;
long long i = 1;
for (i=1;i<=n;i*=10)
{
int a = n/i;
int b = n%i;
ans += (a+8)/10 * i + ((a%10)==1 ? b+1:0);
}
return ans;
}
};