階乘的末尾有多少0 Factorial Trailing Zeroes

問題:spa

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

Note: Your solution should be in logarithmic time complexity.io

【注】求階乘的末尾有多少個0,注意時間複雜度要爲lognclass

解決:方法

①首先求出n!,而後計算末尾0的個數。(重複÷10,直到餘數非0)。該解法在輸入的數字稍大時就會致使階乘得數溢出,不足取。im

②O(logn)解法:只有2和5相乘纔會出現0,其中整十也能夠看作是2和5相乘的結果,因此,能夠在n以前看看有多少個2以及多少個5就好了,又發現2的數量必定多於5的個數,因而咱們只看n前面有多少個5就好了。時間

考慮n!的質數因子。後綴0老是由質因子2和質因子5相乘得來的。若是咱們能夠計數2和5的個數,問題就解決了。考慮下面的例子:while

n = 5: 5!的質因子中 (2 * 2 * 2 * 3 * 5)包含一個5和三個2。於是後綴0的個數是1co

n = 11: 11!的質因子中(2^8 * 3^4 * 5^2 * 7)包含兩個5和三個2。因而後綴0的個數就是2time

咱們很容易觀察到質因子中2的個數老是大於等於5的個數。所以只要計數5的個數就能夠了。那麼怎樣計算n!的質因子中全部5的個數呢?一個簡單的方法是計算n/5。例如,7!有一個5,10!有兩個5。除此以外,還有一件事情要考慮。諸如25,125之類的數字有不止一個5。例如,若是咱們考慮28!,咱們獲得一個額外的5,而且0的總數變成了6。處理這個問題也很簡單,首先對n÷5,移除全部的單個5,而後÷25,移除額外的5,以此類推。

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

相關文章
相關標籤/搜索