題目:給定一個整數N,那麼N的階乘N!末尾有多少個零呢?
末尾有幾個零?若是咱們從哪些數相乘能夠的出10,這個角度來解決這個問題,這就會變成簡單。對質因數進行分解因爲10=2*5,即每一對2和5就能夠產生一個10,若是咱們求出N!中,2和5的分別的次方數,假設爲X,Z,取決於兩個數中最小的那個數,因而有公式,M=min(X,Z),M爲零的個數,因爲在階乘中,2出現的機率比5的高,因此公式M=Z因此
解法一:算法比較簡單,就是直接計算階乘的裏面的每個元素包含5的個數
public static int countZeroNum1(int N){
int num = 0;
for (int i = 1; i <= N; i++) {
int j = i;
while(j%5==0) {
num++;
j/=5;
}
}
return num;
}
解法二:公式 Z=[N/5] + [N/5^2]+ ...該公式的[N/5]含義是在不大於N的階乘中包含一個5的個數,就好比40裏面,包含一個5的個數爲5,10,15,20,..40 即 40/5=8個(裏面有8個元素包含一個5),那當咱們遇到相似於元素爲25時,裏面有5*5時,即裏面有兩個5,因此就用[N/5^2]算出包含兩個5時的個數,相似這樣的運算,當5^k>N時,中止
public static int countZeroNum2(int N) {
int num = 0;
while(N > 0) {
num += (N/5);
N /= 5;
}
return num;
}
本文的內容來自編程之美和我的對題目的一些理解