程式設計之美 階乘末尾0的個數

2021-08-27 17:25:17 字數 1819 閱讀 6729

這個題目是程式設計之美一書中給出的題目。

給定乙個整數n,那麼n的階乘n!末尾有多少個0? 比如:n=10,n!=3628800,n!的末尾有2個0。

1) 遞推

考慮階乘的計算很容易溢位,直接計算階乘肯定不合適。而每次相乘是否會有新的0產生,只和前乙個階乘的最後一位有關。因此只記錄前乙個階乘0的個數和最後一位,就可推出後面的。

**如下:

01intcountzero(intn)

11while(tmp > 10)

12tmp = tmp % 10;

13lastbit = tmp;

14ans += cnt;

15}

16returnans;

17}

18

19intmain()

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的倍數。

01intcountzero(intn)

02

13}

14returnret;

15}

當然還有一種解法:

z =[n/5] + [n/52] + [n/53] + …

[n/5] 表示不大於n的的數中5的倍數貢獻乙個5, [n/52] 表示不大於n的數中52

的倍數在貢獻乙個5……

01intcountzero(intn)

02

09returnret;

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 的個數即可.題解...