/*总体思路:先求个位上出现的1的个数,再找十位再找百位。。
先看个位找找规律:
5(05) 1 1
15 2 1,11
25 3 1,11,21
35 4 1,11,21,31
…
325 33 1,11,21,31,41,…,301,311,321
结论:个位上的1的数目s= N / 10 + 1;
再看十位,找找规律:
25 10 10,11,12,13,14,15,16,17,18,19
35 10 10,11,12,13,14,15,16,17,18,19
95 10 10,11,12,13,14,15,16,17,18,19
125 20 10,11,12,13,14,15,16,17,18,19,110,111,112,…,118,119
725 80 10-19,110-119,210-219,310-319,410-419,510-519,610-619,710-719
3225 330 10-19,20-29,…510-519,610-619,…1010-1019,1110-1119,1210-1219,…,3110-3119,3210-3219
结论:十位上的1的数目s = (N / 100 + 1) * 10;
….
将个位上的1的数目看作
(N / 10 + 1) * 1;
(N / 100 + 1 ) * 10; 十位上的
猜想百位上1的数目应该是:
(N / 1000 + 1 ) * 100
特殊情况,当最高位为1时,最高位上1的数目为其余各位所组成的数加1,如125百位上的1的个数就是25+1=26个
*/
int numberOf1In1_N(int n)//从1到n的整数中1出现的次数
{
if (n == 0)
return 0;
else if(n > 0 && n < 9)
return 1;
int i = 1;
int j = 10;
int count = 0;
while(n / j)
{
int tmp = n / j;
count += (tmp + 1) * i;
if(tmp == 1)
count += n % j + 1;
i *= 10;
j *= 10;
}
return count;
}