题目
输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。
例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。
思路
我们假设高位为high,当前位为cur,低位为low,i代表着需要统计的位置数(1对应个位,10对应十位,100对应百位),则对每一位的个数count有:
cur=0,count = high*i;
cur=1,count=high*i+low+1;
cur>1,count=high*i+i
最终累加所有位置上的个数即最终答案。
代码
class Solution {
public:
int countDigitOne(int n) {
long m = 1;
int sum = 0;
while(n/m!=0){
int a = (n / m) % 10;
if(a == 0){
sum += (n/(m*10))*m;
}else if(a == 1){
sum += (n/(m*10))*m + n%m + 1;
}else{
sum += (n/(m*10))*m + m;
}
m = m * 10;
}
return sum;
}
};