JAVA程序设计:阶乘函数后K个零(LeetCode:793)

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 的性质。

示例 1:
输入:K = 0
输出:5
解释: 0!, 1!, 2!, 3!, and 4! 均符合 K = 0 的条件。

示例 2:
输入:K = 5
输出:0
解释:没有匹配到这样的 x!,符合K = 5 的条件。
注意:

K是范围在 [0, 10^9] 的整数。

     JAVA程序设计:阶乘函数后K个零(LeetCode:793)_第1张图片

思路:这个题和之前做的51nod的一道题很像,只是呢道题是要求任意数的阶乘末尾0的个数,和这道题其实差不多,中间的原理是一样的,需要一些简单的数论知识。我们知道两个大数字相乘,都可以拆分成多个质数相乘,而质数相乘结果尾数为0的,只可能是2*5。如果想到了这一点,那么就可以进一步想到:两个数相乘尾数0的个数其实就是依赖于2和5因子的个数。又因为每两个连续数字就会有一个因子2,个数非常充足,所以此时只需要关心5因子的个数就行了。

具体找因子里有5的个数的方法可以参考:https://www.cnblogs.com/kuliuheng/p/4102917.html,写起来其实很简单,但是希望读者能够明白其原理,之后我们就可以通过二分答案的方式求本题的答案啦。

class Solution {
    public int preimageSizeFZF(int K) {
    	
    	int ans=0;
    	long l=0,r=100000000000L;
    	
    	while(l=K)
    			r=mid;
    		else
    			l=mid+1;
    	}
    	
    	while(findSum(r++)==K) ans++;
    	
    	return ans;
    }
    
    private long findSum(long x) {
    	long res=0;
    	while(x>0) {
    		res+=x/5;
    		x/=5;
    	}
    	return res;
    }
}

 

你可能感兴趣的:(JAVA程序设计:阶乘函数后K个零(LeetCode:793))