思路
设计一个算法,计算出n阶乘中尾部零的个数
样例
11! = 39916800,因此应该返回 2
分析
x! = r (我们需要计算 r 这个数字尾部有多少个0 )
r = (尾部不为0的因子) * (10的n次方)
这里的n就是我们需要计算得到的
那么 11! = 11 * 10 * 9 * 8 ... 我们需要计算的就是10、2、5的个数。由于 10 = 2 * 5
所以我们只需要计算有多少个2和5, 然后取较小的因子的个数的数量
因为是阶乘, 所以2的个数远大于5的个数, 所以我们只需要计算因子5的个数
Python
class Solution:
"""
@param: n: An integer
@return: An integer, denote the number of trailing zeros in n!
"""
def trailingZeros(self, n):
# write your code here, try to do it without arithmetic operators.
return self.func_2(n)
def func_1(self, n):
# 循环1~n, 暴力求其每个数字5的因子的数量的和
zeros = 0
if n == 0:
return 1
for i in range(1, n + 1):
number = i
while number and number % 5 == 0:
zeros += 1
number /= 5
return zeros
def func_2(self, n):
# 循环1~n, 求单一数字x的因子5的个数可以优化为:
# zeros = [n / 5] + [n / 5*2] + ····
# 例如 26! = 1 × 2 ×3× 4 × 5 × 6 × 7 × 8 × 9 × 10 × 11 × 12 × 13× 14
# × 15 × 16 × 17 × 18 × 19 × 20 × 21 × 22 ×23× 24 × 25 × 26
# zeros = int(26 / 5) + int(26 / 25) = 6
# 25 = 5 * 5 被少计算一次,类推5的x次方被少计算x-1次
zeros = 0
if n == 0:
return 1
i = 5
while i <= n:
zeros += int(n / i)
i *= 5
return zeros
if __name__ == '__main__':
s = Solution()
print(s.trailingZeros(5))
print(s.trailingZeros(11))
print(s.trailingZeros(105))
print(s.trailingZeros(125))
print(s.trailingZeros(30000))
print(s.trailingZeros(1001171717))
Go
package main
import "fmt"
/**
* @param n: A long integer
* @return: An integer, denote the number of trailing zeros in n!
*/
func trailingZeros(n int64) int64 {
// write your code here, try to do it without arithmetic operators.
var zeros, i int64
for i = 5; ; i *= 5 {
zeros += n / i
if n/i == 0 {
break
}
}
return zeros
}
func main() {
fmt.Println(trailingZeros(11))
}