這個題目是程式設計之美一書中給出的題目。
給定乙個整數n,那麼n的階乘n!末尾有多少個0? 比如:n=10,n!=3628800,n!的末尾有2個0。
1) 遞推
考慮階乘的計算很容易溢位,直接計算階乘肯定不合適。而每次相乘是否會有新的0產生,只和前乙個階乘的最後一位有關。因此只記錄前乙個階乘0的個數和最後一位,就可推出後面的。
**如下:
01
int
countzero(
int
n)
11
while
(tmp > 10)
12
tmp = tmp % 10;
13
lastbit = tmp;
14
ans += cnt;
15
}
16
return
ans;
17
}
18
19
int
main()
2)數學解法
程式設計之美一書給出兩個例如質因數的性質的解法。考慮哪些組合可以得到10即可,考慮哪些數相乘能得到10,n!= k * 10m
其中k不能被10整除,則n!末尾有m個0。
對n!進行質因數分解: n!=2x*3y*5z
…,因為10=2*5,所以m與2和5的個數即x、z有關。每一對2和5都可以得到10,故m=min(x,z)。因為能被2整除的數出現的頻率要比能被5整除的數出現的頻率高,所以m=z。其實也很好推出,1-9 中兩兩相乘,末位有0的話必須要有5,其它的數則是2的倍數。
01
int
countzero(
int
n)
02
13
}
14
return
ret;
15
}
當然還有一種解法:
z =[n/5] + [n/52] + [n/53] + …
[n/5] 表示不大於n的的數中5的倍數貢獻乙個5, [n/52] 表示不大於n的數中52
的倍數在貢獻乙個5……
01
int
countzero(
int
n)
02
09
return
ret;
10
}
參考:原文:
N階乘末尾0的個數
輸入乙個正整數n,求n 即階乘 末尾有多少個0?比如 n 10 n 3628800,所以答案為2 輸入為一行,n 1 n 1000 輸出乙個整數,即題目所求要判斷末尾有幾個0就是判斷可以整除幾次10。10的因子有5和2,而在0 9之間5的倍數只有乙個,2的倍數相對較多,所以本題也就轉換成了求n階乘中...
階乘末尾0的個數 2021 1 4
本題在去年寒假的競賽培訓中即出現過,不妨分析一下,n的階乘末尾零的個數即從1到n每個數字包含因子5的個數 可以用電腦上的計算器模擬一下,如,10!末尾零的個數即為2,25!即為6 現提供一種更好的思路,乙個數除以五,得到的即為它包含乙個因子5的個數。然而,乙個數字中可以包含若干個因子5,因此,再將所...
ACM 大數階乘末尾0的個數
階乘末尾0的個數 有乙個題目說的是求 100 的階乘末尾有多少個 0.題解中給出的講解提到,乙個數 n 的階乘末尾有多少個 0 思路 乙個數 n 的階乘末尾有多少個 0 取決於從 1 到 n 的各個數的因子中 2 和 5 的個數,而 2 的個數是遠遠多餘 5 的個數的,因此求出 5 的個數即可.題解...