172. Factorial Trailing Zeroes

问题:

求给定n的阶乘结果中,有多少个0。

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

Example 2:
Input: n = 5
Output: 1
Explanation: 5! = 120, one trailing zero.

Example 3:
Input: n = 0
Output: 0

Constraints:
0 <= n <= 104

  

解法:Factorial(阶乘),因数法

求n!=n*(n-1)*(n-2)*...*5*4*3*2*1

最后结果中有多少个0。

也就是因数中,有多少个2*5=10,

由于含有因数2的乘数,==阶乘因数个数的一半(奇偶成半)。

而含有因数5的乘数,则相较更少,因此能够构成10的个数,决定于5。

 

首先,有多少个乘数中,含有一个5:

n/5,每五个乘数会有一个含有因数5的乘数。

n/(5*5),每25个乘数会有一个含有两个因数5的乘数。

...

n/(5*5*...*5)  -> 直到个数>=0

以此类推。

计算总共有多少个因数5:

n/5+n/(5*5)+n/(5*5*5)+...+n/(5*...*5)

 

代码参考:

 1 class Solution {
 2 public:
 3     //e.g. 125!
 4     //  125/5: (阶乘乘数1~125中)是5的倍数的数有多少个。a
 5     //  125/(5*5):(阶乘乘数1~125中)是25(2个5作为乘数)的倍数的数有多少个。b
 6     //  125/(5*5*5):(阶乘乘数1~125中)是125(3个5作为乘数)的倍数的数有多少个。c
 7     // 有多少个5可以作为乘数,那么就能构成多少个2*5,构成结果中的 0。
 8     // a+b(这里只计算多余出来的那个5,其中一个5已经包含在a中)+c
 9     //(由于含有2作为乘数的数数量一定>5,因此只需要算有多少个5,与相应数量的2,共同构成结果的0的个数。)
10     int trailingZeroes(int n) {
11         int res = 0;
12         for(int d=n; d/5>0; d=d/5) {
13             res += d/5;
14         }
15         return res;
16     }
17 };

 

posted @ 2021-03-24 15:05  habibah_chang  阅读(3)  评论(0编辑  收藏  举报