题目
输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。
例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。
思路分析
- 统计每一位出现1的次数,累加。
- 对于数据12来说,当个位是2,我们要统计小于等于12的个位数上出现1的个数,01和11两个。
- 若为10,只会有01.
- 若为11,有11和01.
代码
typedef long long ll;
class Solution {
public:
int countDigitOne(int n) {
int ans = 0, low = 0, cur = n % 10, high = n / 10;
ll digital = 1;
while(high != 0 || cur != 0){
ans += high * digital;
if(cur == 1) ans += low + 1;
else if(cur > 1) ans += digital;
low += cur * digital;
digital *= 10;
cur = high % 10;
high /= 10;
}
return ans;
}
};
坑点
这道题坑的地方在于num要声明为long long类型。