题目描述:
f(x) 是 x! 末尾是0的数量。(回想一下 x! = 1 * 2 * 3 * ... * x,且0! = 1)
例如, f(3) = 0 ,因为3! = 6的末尾没有0;而 f(11) = 2 ,因为11!= 39916800末端有2个0。给定 K,找出多少个非负整数x ,有 f(x) = K 的性质。
假设这个函数是g(K)。
示例 1:
输入:K = 0
输出:5
解释: 0!, 1!, 2!, 3!, and 4! 均符合 K = 0 的条件。
示例 2:
输入:K = 5
输出:0
解释:没有匹配到这样的 x!,符合K = 5 的条件。
注意:
K是范围在 [0, 10^9] 的整数。
题目分析:
1.如何知道对于非负整数x,x!的末尾存在多少个0呢?
1.1 从因式分解的角度,末尾有0,一定是存在因子5和2。
1.2 从阶乘的角度,每两个数就可以碰到一个2的倍数,所以我们有充足的2可以和5结合。
那么问题就转换成了,对x!因式分解,可以分解出多少个5呢?有多少个5,其末尾就应该有多少个0。
可以通过不断除以5解决,是因为每隔5个数有一个数可以被5整除,
然后在这些可被 5 整除的数中, 每间隔 5 个数又有一个可以被 25 整除,故要再除一次,
直到结果为 0, 表示没有能继续被 5 整除的数了。
这一部分的函数表示为:
int tail0count(long x) //计算尾0的个数 // 注意参数n必须定义成long 不能是int
{
int count = 0;
while(x)
{
count += x/5;//取整
x /= 5;
}
return count;
2. 我们知道了每个x!的末尾有多少个0,那么,有k个0的x一共有多少个呢?
2.1 还是从阶乘的角度,假设已知末尾有k0个0的最小值为x0,随着x0的增大,x0+1~x0+4也持续保持末尾有k0个0,直到再出现下一个5,
所以其实最终的答案只有0和5两种┓( ′?` )┏
2.2 因为函数f(x)是不减的函数,因此可以求解有k个0的最小x0和有k+1个0的最小x1,他们的差值就是有k个0的x的个数啦。
原文:https://www.cnblogs.com/zx62136/p/14238198.html