n!階乘結尾有多少個零?
阿新 • • 發佈:2019-01-14
計算出n!結果後判斷是不行的,結果太大會溢位。正確思路應該是去判斷 n~1之間所有數的特點,這之間的所有數統稱為“子值”吧。
n! 結尾零個數的判斷:(1)“子值”本身結尾的0的個數。(2)“子值”之間相乘產生的新值結尾的0個數。
要判斷上述兩個條件成立:
(1) 先試想:判斷n能被5整除多少次,即n/5就好了嘛,因為這表示"子值"結尾有0 和 "子值"相乘產生0。是否可行看第二點。
(2) 試想是正確的,但是考慮不周,其只能判斷結尾產生一個0的個數,還需要考慮判斷結尾產生多個0的情況。來個假設嘛,判斷產生1個0的個數只要"n/5",那產生2個0是不是"n/5/5"就好呢?其實就是這麼簡單的。多個0便依次類推。
程式碼如下:
int CountZero(int N) { int ret =0; while(N) { ret+=N/5; N/=5; } return ret; } 分析:上述第一次迴圈即是N/5,表示:“子值”結尾有1個0 或 “子值”間相乘產生的新值結尾有1個0 的個數。 第二次迴圈即是N/5/5,表示:“子值”結尾有2個0 或 “子值”間相乘產生的新值結尾有2個0 的個數。剩下的迴圈依次類推了。
演算法學習並不是完全為了面試,對程式設計師的編碼能力提升也是很大的,近期將不斷學習和分享一些演算法部落格,現有需求的朋友歡迎檢視博主“演算法分類”中相關內容。