一、思路
逐位计算‘1’的个数:
设三位数为3x6, 百位数为‘3’, 十位数为‘x’, 个位数为‘6’
则此时有三种情况:
1、x为0时:个位上出现30个‘1’: 分别是百位为0 ~ 2时的010 ~ 019、 110 ~ 019、 210 ~ 219,即3 * 10;
2、x大于1时,个位上出现40个‘1’: 010 ~ 019、 110 ~ 019、 210 ~ 219,以及百位为3时的310 ~ 319,即(3 + 1) * 10;
3、x为1时:个位出现37个‘1’: 分别是百位为0 ~ 2时的010 ~ 019、 110 ~ 019、 210 ~ 219,以及百位为3时的310 ~ 316,即3 * 10 + 16 + 1;
因此归纳:
//设N为某数;
n = N % ( place * 10 ) / place;//n为N的某位数;
h = N / place / 10;//h为N中n的高位数
l = N % place;//l为N中n的低位数
if( !n )//n为0时;
cnt = h * place;
else if( n > 1 )//n>1时;
cnt = (h + 1) * place;
else cnt = h * place + l + 1;//n为1时;
二、代码
#include <cstdio>
int main()
{
int N, sum = 0;
scanf("%d", &N);
for( int d = 1, n, h, l; N / d; d *= 10 )
{
n = N % ( d * 10 ) / d;
h = N / d / 10;
l = N % d;
if( !n )
sum += h * d;
else if( n > 1 )
sum += (h + 1) * d;
else sum += h * d + l + 1;
}
printf("%d", sum);
}