LeetCode 172. Factorial Trailing Zeroes

Description:

Given an integer n, return the number of trailing zeroes in n!.

Example 1:

Input: 3
Output: 0
Explanation: 3! = 6, no trailing zero.

提交的代码如下:

class Solution(object):
    def trailingZeroes(self, n):
        result=0
        while n:
            result+=n//5
            n=n//5
        return result

分析:n的阶乘的计算公式就是1\times 2\times 3 \times \cdots\times n。题目是求改表达式的结果中末尾的0的个数。这道题可以看做是从1到n的任意两个数相乘会出现个10的倍数,这取决于两个两个乘数的个位数。而从1到9的任意两个数的乘法中,2\times 5,4\times 5,6\times5,8 \times 5的结果是10的倍数。按照这种解释,我们可以认为我们要求的就是1到n中的偶数个数与能被5整除的数字的个数的最小值了,前一个数字比后一个数字大,所以该阶乘表达式的结果取决于能被5整除的数字的个数。如果按照这个思路提交代码为会发现报错。以30的阶乘为例,预期结果为7,但是我们返回的却是6。 问题出来哪里呢?问题出在25这个数字上,如果25和2相乘得到50,抛去末尾的0之外又产生了一个5。换一种解释就是,我们可以将25拆分成5\times 5,这样把25当成两个5就可以了。

综上,我们实际要求的就是从1到n的所有整数当中,对其进行因式分解后,所有的因子中的5的个数之和。最后提交的代码如上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值