首先可以对分别对1位数,2位数,3位数,每一位出现1的个数,分别寻找规律,通过仔细查看可以看到,每位1的个数与当前位上的数有关系,并且与他高位的数有关系,低位的数也有关系。
具体如下:
假设N(个,十,百,千……)位上的数字为0,那么N位上为1的个数为其高位的数字乘以当前的位(个,十,百,千,万……)
假设N(个,十,百,千……)位上的数字为1,那么N位上为1的个数为其高位的数字乘以当前的位(个,十,百,千,万……),加上低位数+1(因为从0开始的)
N位上的数字为其他的数字的时候,则其相当于高位的数字乘以当前的位,因为当前位大于1,因此会多出来0-99……个数来,所以高位应该是(高位数+1)*当前位
#include<stdio.h>
void count(int n)
{
int sum=0,iCurNum,iLowNum,iHighNum;
int iFactor=1;//因子
while(n/iFactor!=0)
{
iLowNum = n-(n / iFactor) * iFactor;
iCurNum = (n / iFactor) % 10;
iHighNum = n / (iFactor * 10);
switch(iCurNum)
{
case 0:sum += iHighNum*iFactor;break;
case 1:sum += iHighNum * iFactor + iLowNum + 1;break;
default:
sum += (iHighNum+1) * iFactor;break ;
}
iFactor *=10;
}
printf("%d\n",sum);
}
void main(void)
{
int n;
scanf("%d",&n);
count(n);
}