力扣算法题:阶乘后的零
阶乘后的零
一、介绍
此题出自力扣网题库第172题,我刚开始没有想到,后面看了题解才明白的。
先看看题目,讲得很简单
还有入参的限制,0 <= n <= 104
1 | class Solution { |
放一个计算器,一会自己可以看看规律
输入数字n:
结果:1
结果:1
二、解题思路
1)暴力破解
暴力破解,算出答案,再转字符串,计算出末尾零的个数。
这种方法想都不要想,这可是阶乘,数字量很大的,很容易溢出。不然上面用计算器来试试。
2)优化
不知道你用计算器试过了没有,也不知道你有没有得到规律,我们先一步一步来分析
-
首先要看这道题想要的结果是什么,是零的个数
-
再看题目,阶乘阶乘,里面都是乘法计算,所以想要得到零,必须要乘上10,那么这个10就是因子
-
思路到这,第一步就清除了,查询
n
中有多少个10或者10的倍数,就有多少个零
然而,当你用计算器去试了一下,结果发现,,这也有一个零
-
思维再次扩展,可以发现5*偶数=10的倍数的,这样一来因子是5,而不是10
-
由于偶数很多,所以我们只需要计算出
n
中有多少个5的倍数这样的数,就可以正确得到答案了
1 | public int trailingZeroes(int n) { |
思维发散至这里,已经很强了,但还不够!!!因为,足足有6个0,这是为什么???
-
如果只是遍历5的倍数,算出总共有多少5因子的倍数的话,还是不够的
-
但要注意25这个数,是由5*5而来,要多算一个零。同理125,是由5 * 5 * 5 而来,再多算一个零
-
按照步骤2,我们需要 (n/5) + (n/25) + (n/125) + …
-
可以对步骤3的公式进行优化,提取出,来进行计算,直到n小于5为止,所以就得到了下面这个答案
1 | class Solution { |
三、最后
这道题,我拿到确实懵逼了,直到看完题解才恍然大悟,只能大声高呼,牛逼。
我是半月,祝你幸福!!!
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 半月无霜!
评论
ValineDisqus