题目描述:
给定一个整数 n ,返回 n! 结果中尾随零的数量。
提示 n! = n * (n - 1) * (n - 2) * ... * 3 * 2 * 1
示例 1:
输入:n = 3输出:0解释:3! = 6 ,不含尾随 0
示例 2:
输入:n = 5输出:1解释:5! = 120 ,有一个尾随 0
示例 3:
输入:n = 0输出:0
提示:
0 <= n <= 104
进阶:你可以设计并实现对数时间复杂度的算法来解决此问题吗?
Related Topics
数学
个人思考:
1.暴力求解
暴力求解是求解过程中脑海中的第一个想法,为什么呢?因为简单,不用过多的思考就能上手开始写代码。对应的原理其实也很简单就是计算阶乘后的结果然后对结果从末尾判断0的个数。然后就开始一通啪啪啪的键盘操作,最后自信满满的提交代码,其结果也是可想而知,啪啪啪的打脸来的太快,都没开始就已经结束了
2.以上就是解答失败的结果,测试用例也才通过了21个,但是报错的信息也仅仅提示了数值太大没有,于是就有了第二个想法,那就是把数据结构储存的换成BigDecimal是不是问题就解决了?于是说干就干,立马执行,结果leetcode根本不能识别BigDecimal的数据结构,啪啪啪又一次被打脸了
于是,通过以上的两次失败引发了自己的两个思考:
1.即使n不是很大,但是阶乘的结果往往很大,即使自己使用更大的数据存储还是会有边界的问题存在,而且所占用的内存也会很大,这样达不到自己预期的效果
2.复杂度:题目进阶提醒的复杂度能否缩减?
带着以上的两个问题我开始了解到自己的解题思路有问题,而且问题很大,如果只是解决一个问题可能不是很难,但是要避免各种问题的出现就疲于奔命了,所以需要换种思路解题
如何解题呢?这是新的问题,于是我试着按照最原始的方式列式子找规律先计算小的数的阶乘。3!,4!,5!,6!我发现一个规律,那就是似乎结尾出现0的次数跟5相关,例如5!只有一个0(15),10的阶乘就是(25)似乎只要把一个数除以5似乎就能得到正确的答案,于是代码提交一气呵成,可惜结果依然是错的,25的阶乘返回了6,这似乎与自己想的不一样但又好像差不了多少,那么问题出现在哪里呢?为什么25(5*5)的阶乘是6?等等,似乎有点不对,前面我们只考虑了除以5的结果,然而忽略了除以5后的结果,什么意思呢?举个例子,例如25的阶乘我只考虑了除以5 的结果,并没有考虑结果中是否还能继续的>=5,所以我将结果又再一次作为阶乘的值代入,这样的结果就得到的6,具体的逻辑就是25 / 5 =5,结果为5时,又再一次的5/5得到1,将两次的结果相加的到6,具体的代码如下
这次的提交果然没让我失望,验证成功并通过,而且内存的使用和执行时间都还不错,上面所说的两个问题也得到了解题这就是我解题的整个思考过程和解题思路,更像是摸着石头过河,遇到问题的时候去解决问题,解决不了问题时,一定是自己的解题思路出现了问题,推倒重来往往能收获意想不到的结果
标签:25,示例,结果,问题,解题,阶乘
From: https://www.cnblogs.com/java-cheng/p/18403341