首页 > 其他 > 详细

793. 阶乘函数后K个零

时间:2021-01-05 22:20:33      阅读:34      评论:0      收藏:0      [点我收藏+]

题目描述:

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的个数啦。

int binsearch(int K)//查找阶乘有K个0的最小数
    {
        long l = 0, r = 1e10, mid, count0;
        while(l < r)
        {
            mid = l+((r-l)>>1);
            count0 = tail0count(mid);
            if(count0 < K)
                l = mid+1;
            else// if(count0 >= K)
                r = mid;
        }
        return l;
    }
 
两个结合起来
class Solution {
public:
int preimageSizeFZF(int K) {
        return binsearch(K+1)-binsearch(K);
    }

    int tail0count(long n)//计算尾0的个数 // 注意参数n必须定义成long 不能是int
    {
        int count = 0;
        while(n)
        {
            count += n/5;
            n /= 5;
        }
        return count;
    }
    int binsearch(int K)//查找阶乘有K个0的最小数
    {
        long l = 0, r = 1e10, mid, count0;
        while(l < r)
        {
            mid = l+((r-l)>>1);
            count0 = tail0count(mid);
            if(count0 < K)
                l = mid+1;
            else// if(count0 >= K)
                r = mid;
        }
        return l;
    }
};
 

793. 阶乘函数后K个零

原文:https://www.cnblogs.com/zx62136/p/14238198.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!