问题:
求给定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 };