LeetCode 793 阶乘函数后K个零
Posted ambition-hhn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 793 阶乘函数后K个零相关的知识,希望对你有一定的参考价值。
基本上算是一道数学题,给出一个数字K,问有多少个非负整数的阶乘末尾有K个零。当初只知道答案只可能是0或5,因为末尾有0必定是2和5的乘积,每过五个数末尾0的数量一定会改变,求出阶乘有多少个2*5就不容易了,因为不可能实际求出阶乘。问题可以转变成求出有多少个因子5,因为2一定比5多,后来看了官方的解题思路,才明白怎么求出5的个数,阶乘中像5,10,15......每过5个数必有一个5的因子,像25,50,75。。。。。。每过52必定含有两个5,因为第一轮我们已经统计过这些数的其中一个因子5,所以我们在第二轮只需统计另一个因子5,一直重复下去直到第n轮X!中的X比5n要小,综上,我们可以这样求出阶乘中因子5的个数为?X/5?+?X/(52)?+?X/(532)?+?X/(54)?+?X/(5^5)?+......这个函数是递增的,我们可以用二分来找到是否有数满足这个条件,如果有,那必定是五个数,没有就返回0。注意变量尽量都用long long,否则很可能出现越界错误。
class Solution {
public:
long long judge(long long x)
{
if(x>0)
return x/5+judge(x/5);
else
return 0;
}
int preimageSizeFZF(int K) {
long long l=0,r=0x7ffffffff,mid,now,flag=0;
while(l<=r)
{
mid=l+(r-l)/2;
now=judge(mid);
if(now>K)
{
r=mid-1;
}
else if(now<K)
{
l=mid+1;
}
else
{
flag=1;break;
}
}
if(flag) return 5;
else return 0;
}
};
以上是关于LeetCode 793 阶乘函数后K个零的主要内容,如果未能解决你的问题,请参考以下文章