题解
now - 当前位的数值
left - 在now左边的所有数字
right - 在now右边的所有数字
mul - right的数量级,如 10,100,100
① 如果 now == 0 ,当now可以为1时,左边的数值必须为(0 ~ (left-1)),右边的数值可以是 0 ~ 999… ,所以情况有 left*mul
② 如果 now == 1 ,在第①种情况下,再加上right+1,因为当前位已经为1,所以右边的数right在当前范围下是什么无所谓,所以情况为 left*mul+right+1
③ 如果 now > 2 ,在第①种情况下,再加上mul,因为now > 2,所以now = 1时,右边的数是什么无所谓,不会超范围,所以情况为 left*mul+mul
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,left,right,mul=1,now,ans=0;
scanf("%d",&n);
while(n/mul)
{
left=n/(mul*10);
right=n%mul;
now=n/mul%10;
if(now==0) ans+=left*mul;
else if(now==1) ans+=left*mul+right+1;
else ans+=left*mul+mul;
mul*=10;
}
printf("%d",ans);
system("pause");
return 0;
}