#include<iostream>
using namespace std;
int countDigitOne(int n) {
long long digit=1,ans=0,after=0; //digit表示当前遍历到的数位after表示之后的数字
while(n)
{
int cur=n % 10 ; //cur当前的数字
n /= 10 ; //n此时表示了cur之前的数字
if(cur > 1 ) ans+=(n+1)*digit; //如果cur>1 那么after就可以转成99
else if(cur==1) ans+=n*digit+after+1; //如果cur==1 那么after就是后面可以取到的最大值n*digit+after+1
else ans+=n*digit; //如果cur==0 那么after的值就可以忽视了 只看cur之前的n就可以了
after+=cur*digit; //将当前数位加入到after 继续向前遍历
digit*=10; //数位进位
}
return ans;
}
int main()
{
cout<<countDigitOne(4321);
}
以4321为例 ,