题目
描述
输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数
例如,1~13中包含1的数字有1、10、11、12、13因此共出现6次
示例1
输入:
13
返回值:
6
解
通过列举几个例子:
2457:
个位1的个数:
0001,0011,0021,0031…2451 ----共(245+1)个1
十位1的个数:
001,011,021,031…241 ----共(24+1)*10个1
百位1的个数:
01,11,21 ----共(2+1)*100个1
千位1的个数:
1 ----共(0+1)*1000个
共:246+250+300+1000 = 1796 个1
405:
个位1的个数:
001,011,021,031…401 ----共(40+1)个1
十位1的个数:
01,11,21,31…391 ----共(39+1)个1
百位1的个数: ----共1个
415:
个位1的个数:
001,011,021,031…401 ----共(40+1)个1
十位1的个数:
01,11,21,31…41 ----共(39+1)*10 + (5+1)个(41-只有410-415个数)
百位1的个数: ----共1个
所以代码如下:
class Solution {
public:
int NumberOf1Between1AndN_Solution(int n) {
int chu = n;
int yu = n%10;
int sum = 0;
int e = 1;
while(chu)
{
chu /=10;
if(yu == 0)
sum += chu*e;
else if (yu == 1)
sum += chu*e + n%e+1;
else
sum += (chu+1)*e;
yu = chu%10;
e *= 10;
}
return sum;
}
};