题目描述 (从1到n整数中1出现的次数)
求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。
解题思路
- 有规律可循
- 从位数小开始,统计1的个数
- 位数越大,重复统计的越多,规律越明显
- 商的最后一位是1,则有b+1个1
(a%10==1)*(b+1)
- 商加上8除以10的商乘以当前位数的最小值为1的个数
(a+8)/10*1
class Solution {
public:
int NumberOf1Between1AndN_Solution(int n)
{
int count = 0;
long long i = 0;
for (i = 1; i <= n;i*=10) {// 统计各个数位
int a = n/i;// 商
int b = n%i;// 余数
//
count = count + (a+8)/10*i + (a%10==1)*(b+1);
}
return count;
}
};
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1056615746@qq.com