[LeetCode]172. Factorial Trailing Zeroes
2016-07-26 18:38
399 查看
Given an integer n, return the number of trailing zeroes in n!.
Note: Your solution should be in logarithmic time complexity.
解题思路:
考虑n!的质数因子。
后缀0总是由质因子2和质因子5相乘得来的。因此,只要数2和5的个数就解决了。
质因子中2的个数总是大于等于5的个数,所以只需要数5。
即计算floor(n/5)。例如,7!有一个5,10!有两个5。
除此之外,还有件事情要考虑。诸如25,125之类的数字,有不止一个5。例如28!,会有一个额外的5,0的总数变成了6。
处理这个问题,首先n/5,移除所有的单个5,然后n/25,移除额外的5,以此类推。
因此,最终的计算方法:
n!后缀0的个数 = n!质因子中5的个数 = floor(n/5) + floor(n/25) + floor(n/125) + ....
JavaScript代码:
Note: Your solution should be in logarithmic time complexity.
解题思路:
考虑n!的质数因子。
后缀0总是由质因子2和质因子5相乘得来的。因此,只要数2和5的个数就解决了。
质因子中2的个数总是大于等于5的个数,所以只需要数5。
即计算floor(n/5)。例如,7!有一个5,10!有两个5。
除此之外,还有件事情要考虑。诸如25,125之类的数字,有不止一个5。例如28!,会有一个额外的5,0的总数变成了6。
处理这个问题,首先n/5,移除所有的单个5,然后n/25,移除额外的5,以此类推。
因此,最终的计算方法:
n!后缀0的个数 = n!质因子中5的个数 = floor(n/5) + floor(n/25) + floor(n/125) + ....
JavaScript代码:
var trailingZeroes = function(n) { var countFive = 0; var divisor = 5; while (divisor <= n) { countFive += Math.floor(n/divisor); divisor *= 5; } return countFive; };
相关文章推荐
- 2016 Multi-University Training Contest 3 hdu 5753 Permutation Bo【打表+递推】
- MAT分析器中的shallow and retained heap详解
- 2016 Multi-University Training Contest 3 hdu 5752 Sqrt Bo【思维】
- SORT
- 我与IDEA的不舍情缘
- 2016 Multi-University Training Contest 3-1011.Teacher Bo,暴力!
- Communications link failure的解决办法
- Dialog CTS fail-DialogTest.testSetDismissMessage fail原因和解决办法
- hdu 5752 Sqrt Bo(2016 Multi-University Training Contest 3——水题)
- OnPaint和OnDraw的区别
- 11gR2 Grid infrastructure fails to install
- grails与ajax书写
- zhishangbuzaixianxilie
- 有限状态机&Time_wait的解读
- Incorrect key file for table './xx_db/xx_table.MYI'; try to repair it
- perl:warning:Setting locale failed解决办法
- HDU-2016 Multi-University Training Contest 3-Sqrt Bo-大数开方
- rails production secret_key的设置
- failed to load session "ubuntu"
- Rails Respond Format 应用