LeetCode-172.Factorial Trailing Zeroes

来源:互联网 发布:anaconda mac 安装 编辑:程序博客网 时间:2024/06/04 18:21

https://leetcode.com/problems/factorial-trailing-zeroes/

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

Note: Your solution should be in logarithmic time complexity.

比较笨的办法,就是分别统计因数中10,5,2的个数

int trailingZeroes(int n){int nn = n, n10 = 0,n5=0,n2=0;while (n / 10 > 0){n /= 10;n10 += n;}n = nn;while (n / 5 > 0){n /= 5;n5 += n;}n5 -= n10;n = nn;while (n > 0){n &= (n - 1);n2++;}n2 = nn - n2;return n10 + min(n5, n2);}

分析:

1、代码中用到了n!中求因数k个数的办法。

比如30!求因数5的个数:

首先30/5=6,说明5*1、5*2、...5*6中各有一个因数5

然后6/5=1,说明5*5*1中有两个因数5。

即n/5 + n/25 + n/125 + n/625 + n/3125+...

while (n / k> 0){n /= k;nk += n;}
2、求因数2个数的办法比较特殊,题191.Number of 1 Bits中已经用过

3、显然n5肯定比n2小,所以不需要统计n2。所以返回值即n10+n5,又n5实际上是减了n10,因此只要返回原始的n5就好。

int trailingZeroes(int n)     {        int n5 = 0;    while (n / 5 > 0)    {    n /= 5;    n5 += n;    }    return n5;    }


0 0
原创粉丝点击