最近做一些lc上的题,有些感觉挺好的记录一下:
原题描述如下:
//给定一个整数 n,返回 n! 结果尾数中零的数量。
//
// 示例 1:
//
// 输入: 3
//输出: 0
//解释: 3! = 6, 尾数中没有零。
//
// 示例 2:
//
// 输入: 5
//输出: 1
//解释: 5! = 120, 尾数中有 1 个零.
//
// 说明: 你算法的时间复杂度应为 O(log n) 。
// Related Topics 数学
=============================
首先阶乘的就是n! = 1 * 2 *3 * ... * n
题目让求,阶乘后的数字有几个0,首先肯定都会的一种方法就是,计算出阶乘在除10的方式能求出几个0,但是这种方法有问题,首先不符合题目的时间复杂度O(log n) 。其次是阶乘很大,很容易溢出。所有最好的解法肯定不是这个。
我们需要再次思考,尾数中有几个0,这是个线索,什么情况下会出现0呢? 2 * 5 = 10,4 * 5 = 20,5 * 8 = 40;我们发现这些相乘都会有0,但是我们就拿2 * 5 = 10就行,这个最小合成0的数字组合,没有其他干扰。
然后再从阶乘中看一些猫腻:
例如:
5! = 1 * 2 * 3 * 4 * 5=X,X有一个0
15! = 1 * 2 * ... * 15=X,X有三个0
为什么呢,我们可以看出来这里含有很多2和5,但是2和5的个数不想等,我们肯定是找出现次数小的数字,那就是5了,看看他出现了几次,就能有5 * 2的次数,也就是出现几个0。到这了是不是思路就很清楚了,但是还差一点,如下例子:
25! = 1 * ... * 5 * ... * 10 ... * 15 ... * 20 * ... * 25 =X, 这里的X有6个0,发现25 / 5 不是=5吗,那是的,只不过25这个数字可是有5 * 5,能多提供一个5哦,这时候,就是5 + 1 = 6 有6个5,也就是6对(5 * 2)阶乘的结果有6个0。
当然这里的2的个数肯定是满足和5相乘的个数的,可以自己展开去看看2是每2个数字就会出现一次,所以完全足够匹配5的。
所以可以得出公式就是(n/5) +( n/25) + (n/125) + (n /...)个 0,这里的n就是阶乘的个数。
对上面的分析25!的阶乘结果尾数有6个0的分析可以参考下图,会更加清楚
可以看到我标示了这些数组由几个5组成的哦。仔细思考下即可明白。
其实这道题是easy的,但是很有意思,解决思路不会是我们一开始想的那种暴力解法。
其次,附上代码很简单: