1. 程式人生 > >n!階乘結尾有多少個零?

n!階乘結尾有多少個零?

     

        計算出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 的個數。剩下的迴圈依次類推了。

        演算法學習並不是完全為了面試,對程式設計師的編碼能力提升也是很大的,近期將不斷學習和分享一些演算法部落格,現有需求的朋友歡迎檢視博主“演算法分類”中相關內容。