Leetcode172 Factorial Trailing Zeroes

题目

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

Note: Your solution should be in logarithmic time complexity.


中文大意

给定整数n,返回改整数阶乘n!结果的尾随零的个数


分析

直观的思路是:先求出阶乘结果n!,然后循环计算出n!%10 得到尾随0的个数,这样的做法容易出现超出数据类型范围的情况。现在换一种思路,求阶乘结果的尾随0数m,即阶乘结果是10^m的倍数,而10 = 5 * 2,而n! = n * (n-1)*...*2*1,那么只需要求出,将1到n这n个数分别分解成质数因子的乘积中,所有因数5的个数或因数2的个数的最小值,由于2的个数一定比5的个数多,所以只需要求出在这n个数的质因子中5的总个数count。

假设n= 627,在1.....627中,只要隔5个数就会得到一个5的倍数,627/5 = 125 就可以得到:这627个数字中有125个数分别可以分解出一个质因子5,但是这依然没有完成我们的要求,因为在第一次求出count=125的基础上,在25,50,75,100等这些数字里还可以再分解出质因子5,而125,250等数字里还可以分别分解出2个质因子5,625中还可以分解出3个质因子,那么还需要将这些质因子的个数加在count上,那么就需要计算n个数中,多少个25的倍数;n个书中,多少个125的倍数......。最终count的计算公式为count = n/5 + n/25+n/125 +n/(5^4)+....直到n/(5^x) == 0为止。


java代码实现

class Solution {
    public int trailingZeroes(int n) {
        int count = 0;
        while(n> 0){
            n /= 5;
            count += n;
        }
        return count;
    }
    
   
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值