0到n之间数字d出现的次数

给定两个数字n和d,d在0~9之间
判断在0 ~ n之间的所有数中,数字d出现的次数
比如n=32, d=4, 则共出现4, 14, 24三次
这道题跟剑指offer中 整数中1出现的次数(从1到n整数中1出现的次数) 有点像,不同点在于数字在0~9之间随机,且范围为[0, n]
先将32减到29,保证能覆盖所有个位数,则共包含9、19、29三个数
再看十位数,最大值只到十位数为2,因此十位数=4的个数为0
因此共三个
再来n=175,d=6
同样先看个位数,先减到169则共有6、16…、166共16 + 1=17个数字
再看十位数,由于个位数已看完,则将原数/10=16,则又可以看成0~16之间6出现在个位数的次数,共有6、16两个
而这里要注意,由于这里是十位数,因此对应到原数需要乘10
即以6开头的有:60 ~ 69这十个,而以16开头的有160~169这十个
因此当d=6出现在十位数,共有2*10=20个
同理若d出现在百位数,将有c * 100个
因此整个流程可用递归实现:

unsigned check(unsigned n, unsigned d)
{
	unsigned res = 0;
	while (n)
	{
		if (n % 10 == d) res++;
		n /= 10;
	}
	return res;

}
// [0, n] 出现d的次数
unsigned count(unsigned n, unsigned d)
{
	if (n < 10) return (d > 0 && n >= d);
	if (n % 10 != 9) return check(n, d) + count(n - 1, d);
	return 10 * count(n / 10, d) + n / 10 + (d > 0);
}

猜你喜欢

转载自blog.csdn.net/weixin_43571920/article/details/106745376