生活随笔
收集整理的這篇文章主要介紹了
计算n!中结尾零的个数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
計算n!中結尾零的個數(C++實現)?。
[cpp]?view plaincopy
#include????? ???? /*計算n!結尾零的個數,返回零的個數。*/???? int?CalZeroNum(int?n)???? {???? ????int?result=1;???? ????int?num=0;???? ???? ????/*計算n的階乘,結果保存在result中。*/???? ????int?i;???? ????for(i=n;i>=1;i--)???? ???????????result*=i;???? ???? ????/*計算result結尾零的個數*/???? ????while(1)???? ????{???? ????????if(result%10==0)???? ????????{???? ????????????result/=10;???? ????????????num++;???? ????????}???? ????????else????? ????????????break;???? ????}???? ????return?num;//返回零的個數。???? }???? ???? void?main()???? {???? ????printf("10!結尾零的個數為:%d/n",CalZeroNum(10));???? }????
?
?
算法思想:在1-10兩個數相乘要產生0,只有?10×1=2×5,2×5。
??200!=200×199×198……×2×1=2×5×2×5×2×199….?×2×1;可以分解為質數相乘的形式,很明顯有2的個數比5的多,所以只要求出200的階乘可分解出多少個5相乘,就可得到200的階乘結尾的連續的零的個數.
即:num=[200/5]+[200/5/5]+[200/5/5/5].
注: [x]表示對x取整.
所以可以通過這個思路很容易的得到任意階乘結尾連續的零,其示例C語言代碼如下:
[cpp]?view plaincopy
#include????? ???? /*計算n!結尾零的個數,返回結尾零的個數。*/???? int?CalZeroNum(int?n)???? {???? ????int?num=0;//n!結尾零的個數???? ????int?b=1;//5的次方???? ????while(1)???? ????{???? ????????b*=5;???? ????????num+=n/b;???? ????????if(b>n)???? ????????????break;???? ????}???? ????return?num;//返回結尾零的個數???? }???? ???? void?main()???? {???? ????printf("20!結尾零的個數為:%d/n",CalZeroNum(20));???? } ? ?
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的计算n!中结尾零的个数的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。