2. 尾部的零

21 篇文章 0 订阅
11 篇文章 0 订阅

思路

设计一个算法,计算出n阶乘中尾部零的个数
样例
    11! = 39916800,因此应该返回 2
分析
    x! = r (我们需要计算 r 这个数字尾部有多少个0 )
    r = (尾部不为0的因子) *  (10的n次方)
    这里的n就是我们需要计算得到的
    那么 11! = 11 * 10 * 9 * 8 ... 我们需要计算的就是1025的个数。由于 10 = 2 * 5
    所以我们只需要计算有多少个25, 然后取较小的因子的个数的数量
    因为是阶乘, 所以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))
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值