LintCode算法刷題之尾部的零

鏈接:尾部的零

描述

設計一個算法,計算出n階乘中尾部零的個數

樣例

樣例 1:
輸入: 11
輸出: 2
樣例解釋:
11! = 39916800, 結尾的0有2個。

樣例 2:
輸入: 5
輸出: 1
樣例解釋:
5! = 120, 結尾的0有1個。

挑戰

O(logN)的時間複雜度

算法思路

  首先,我們需要知道N的階乘是如何運算的

  N! 代表N的階乘
  N! = 1 * 2 * 3 * 4 * 5 * 6 * 7 ... * N-1 * N
 
  簡而言之,就是從1乘到N
 
  然後,我們需要知道尾部的0是如何出現的
 
  經過觀察,我們發現尾部的0是 5和偶數相乘 得到的
 
  所以該問題轉換爲從1乘到N,裏面有多少個5相乘
 
 
  從1開始,那麼每數5個數一定是5的倍數,即最少含有一個5進行最後的乘法運算
 
  所以我們首先以5作爲步長,可查出有多少個符合條件的數 即 a = N/5
 
  我們定義sum = 0 爲N的階乘尾部的0的結果
 
  我們將算得的數字加起來 sum += a
 
  它們類似:
      5 10 15 20 25 30 35 40 45 50 55 60...
 
  但其中有些5的倍數中,還存在多個5相乘,比如25是5 * 5,125是5 * 5 * 5,也需要計算出來
 
  根據規律,每5個又會多出現一個5,所以再除以5  a = a/5
 
  我們將算得的數字加起來 sum += a
 
  它們類似:
     25 50 75 100 125 150 175 200 225 ...
 
  此時我們已經計算出兩個5,但數據中還可能出現包含更多5的數字,如125包含3個5相乘,也需要計算出來
 
  根據規律,每5個又會多出現一個5相乘,所以再除以5  a = a/5
 
  我們將算得的數字加起來 sum += a
 
  以此類推,直至除得的結果除不開五,sum即爲所求0的數量

代碼

    public static long getZero(long num) {
        long sum = 0;
        while (num != 0) {
            num /= 5;
            sum += num;
        }
        return sum;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章