天天看點

LintCode 2.尾部的零

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

樣例

11! = 39916800,是以應該傳回 2

思路:

1 * 2 * 3 * 4 * ......* N中每一個因數分解因子,結果: 1 * 2 * 3 * (2 * 2) * 5 * (2 * 3) *7 * (2 * 2 *2) *...... 10進制數結尾每一個0都是因數10存在,對于任何進制都一樣,對于一個M進制的數,結果變0就等于乘以M 10可以分解為2 * 5——隻有2和5相乘能産生一個10。 分解後整個因式有多少個<2,5>就有多少個0,2個數顯然多餘5的個數,是以,有多少個5就有多少個<2, 5>。 是以,讨論n階乘結尾有幾個0的問題,就被轉換成1到n所有這些數的分解式有多少個5的問題

23!=1×2×3×4×5×6×7×8×9×10×11×12×13×14×15×16×17×18×19×20×21×22×23

對于1到23有多少數字被5整除? 5, 10,15,20。是以23!的尾數零有4個,23/5 = 4 有些數是5^2,5^3,是以要再次除以5得到5平方的因子......

5,10,15,20有一個5的因子 25,50,75有2個5的因子 125等包含了3個5的因子 ↓ 除以5第一遍得到1個5的因子的數量 第二遍 得到2個5的因子的數量 第三版 得到3個5的因子的數量 相加最後得到尾數為0的數量

105的階乘,1-105有21個被5整除的數,105/5 =21; 1-21能4個能被5整除的數,21/5 = 4;

public long trailingZeros(long n) {
        long count = 0;  
        while(n >0){  
            count += (n/5);  
            n /= 5;  
        }  
    return count;  
	}