剑指offer43-AcWing-56. 从1到n整数中1出现的次数
输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。
例如输入12,从1到12这些整数中包含“1”的数字有1,10,11和12,其中“1”一共出现了5次。
样例
输入: 12
输出: 5
思路:
分别判断数值每一位出现1的次数。
若该数值位为0,则该位数出现1 的次数只与高位有关
若该数值位为1,则该位数出现1 的次数不仅与高位有关还与低位有关
若该数值位为2,则该位数出现1 的次数只与高位有关
C++ code:
class Solution {
public:
int numberOf1Between1AndN_Solution(int n) {
int num = n;
//count用来记录最后的结果
int count = 0;
//用来记录计算到数值的哪一位
int n1 = 1;
while(num){
int temp = num % 10;
num = num / 10;
int temp_num = pow(10, n1 - 1);
//若是该位数等于0,则1的次数等于高位数*pow(10,n1 - 1)
if(temp == 0){
count += num * temp_num;
//若是该位数等于1,则1的次数等于高位数*pow(10,n1 - 1)再加上地位数值+1
}else if(temp == 1){
count += num * temp_num;
count += n % temp_num + 1;
//若是该位数>1,则1的次数等于(高位数 + 1)*pow(10,n1 - 1)
}else{
count += (num + 1) * temp_num;
}
n1 += 1;
}
return count;
}
};