上面的那种各个数据进行遍历的方法,耗时,
我们可以通过根据数的规律进行观察是否存在某种规律:
当N是1位数的情况:
如果N=3,那么从1到3的所有数字总,1,2,3,只有你个位数字的出现的个数是1,
当N=9时,出现1的个数也是1个。
当N是两位数的时候:
当是两位数的时候,个位和十位上都可能出现1,我们分开考虑,
当N=33时,所有数中个位出现1的个数是4,在十位上出现1的个数是10,总数是14
当N=55式,个位数上出现1的个数是6,十位上出现1的个数是10,总数是16
sum(19)=个位出现的个数+十位出现的个数=2+10=12
sum(29)=个位出现的个数+十位出现的个数=3+10=13
sum(39)=个位出现的个数+十位出现的个数=4+10=14
。。。。。。。。。。。。。。
sum(99)=个位出现的个数+十位出现的个数=10+10=20
当N是三位数的时候:
分别统计百位、十位‘个位上1的个数
9以下: 1个
99以下: 1*10+10*1=20个
999以下: 100*1+10*20=300个
9999以下: 1*1000+10*30=4000个
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
9999999999以下: 9000000个
999999999999以下: 100000000个
当n增加10,至少增加1个1
当n增加100,至少增加20个1
当n增加1000,至少增加300个1
当n增加10^k,时,至少增加k*10^k-1个1
代码:
int coutinter(int n)
{
int count = 0;
int ifactor = 1;
int islower = 0;
int icurrnum = 0;
int ihigh = 0;
while (n / ifactor != 0)
{
islower = n - (n / ifactor)*ifactor;
icurrnum = (n / ifactor) % 10;
ihigh = n / (ifactor * 10);
switch (icurrnum)
{
case 0:
count += ihigh*ifactor;
break;
case 1:
count += ihigh*ifactor + islower + 1;
break;
default:
count += (ihigh + 1)*ifactor;
break;
}
ifactor *= 10;
}
}