LeetCode
给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。
感觉挺有意思
对于一个数,我们先局部分析一下,比如123456,我们考虑百位这个位置上,1出现的个数,对于100~199中,1可以出现100次,对于我们这个数,有123个这样的循环,所以百位上的1有123 * 100,当然,这还不够完全,我们还要考虑余下的循环,也就是456这个数,对于这个数我们对100取余,假设取余结果为p
所以得到我们的公式

同理,我们可以得到其他位数上的1出现的和

typedef long long ll;
class Solution {
public:
int countDigitOne(int n) {
ll k = 1, res = 0;
while(n >= k){
res += (n / (k * 10)) * k + min(max(n % (k * 10) - k + 1, (ll)0), k);
k *= 10;
}
return res;
}
};
原文:https://www.cnblogs.com/AKing-/p/15136204.html