小学 n 阶乘的后面包含多少零c语言,C语言---求n的阶乘后面有多少个连续的0
C語言---求n的階乘后面有多少個連續的0
題目描述:給定一個正整數n,返回n的階乘尾部連續0的個數。
例如:(5,5*4*3*2*1=120,則返回1),(10,10*9*8*7*6*5*4*3*2*1=3628800,則返回2)
題目分析:首先拿到這道題,直接可以想到最簡單的方法就是,通過循環算出這個值,然會取個位,減個位,統計一下個數即可。但是運行后就發現不可行,因為如果n稍微大一點,則算出的這個值就太大了,保存不了,且運行超時,所以這種方法不可行。
于是就得想別的方法了,最后上網查資料發現還有一種巧妙的解法,那就是將可以造成尾部出現0的情況進行分析,發現10可以由2*5造成,發現20可以由2*2*5造成,發現100可以由2*2*5*5造成。。。
多試幾組數據,可以發現其規律:尾部0的個數等于min{2的個數,5的個數}
因為尾部的0是由2*5得來的,雖然也可能是4*5得來的,但是4也是由2*2得來的,所以尾部的0根本上是由2*5得來的。
這里可以發現:一對2和5可以造成尾部一個0,n對2和5可以造成尾部n個0,但是由于2可以由太多太多的數據分解得來,所以我們這里主要看5的個數主要由哪些數分解得來即可:
比如:
5!= {1 * 2 * 3 * 4 * 5} 這里只有1個5,分別是5
10!= {1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10} 這里有2個5,分別是5,10(10是由2*5組成的)
...
25!= {1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * ... * 21 * 22 * 23 * 24 * 25} 這里有6個5,分別是 5,10,15,20,25(25是由5*5組成的,所以25算2個5)
...
125!= {1 * 2 * 3 * 4 * 5 * ... * 25 * ... * 50 * ... * 75 * ... * 100 * ... * 121 * 122 * 123 * 124 * 125}這里有31個5,分別是5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,
(這里除了25,50,75,100各自是由5*5組成,算兩個5,而125是由5*5*5組成的,所以125單獨算三個5)
我們可以發現每隔上5個數會出現一個5,隔上25個數又單獨多出來一個5,隔上125個數又單獨多出來兩個5...
所以我們可以這樣編寫代碼:
①:首先可以從1 -> n隔上5個數抽取一次,獲取這些數組成一個數列
②:如果上面數列的個數>=5,就再從上面數列中再隔上5個數抽取一次,獲取這些數組成一個新的數列
⑤:如果上面數列的個數>=5,就再從上面數列中再隔上5個數抽取一次,獲取這些數組成一個新的數列(直到獲取的數列中的數的個數小于5,則停止)
例如求125的階乘后面有多少連續的0:
這里用tmp統計5出現的個數
①:第一遍獲取可以得到單5:{5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125},所以tmp = 25
②:因為其個數肯定 >= 5,所以進行第二遍獲取可以得到5*5:{25,50,75,100,125},所以tmp = 25 + 5 = 30
③:因為其個數剛剛好 == 5,所以進行第三遍獲取可以得到5*5*5:{125},
所以tmp = 25 + 5 + 1 = 31
④:因為其個數肯定 <=5,所以不進行第四遍獲取,直接退出循環即可。
所以我們可以得到125的階乘后面有31個連續的0
C語言代碼如下:
#include
int num(int n)
{
if(n < 0)//只要正整數,防止負數
{
return -1;
}
int i = 0;
int j = 5;//逐層按 5 5*5 5*5*5 進行抽取
int count = n;//統計逐次抽出了多少個數,初始值個數為總體個數
int tmp = 0;//統計5的個數
while(count >= 5)
{
count = 0;//進來后第一件事,讓其先歸零,重新統計抽取個數
i = 0;//進來后第一件事,也讓i歸零,因為i要從頭開始遍歷
while(i + j <= n)
{
tmp++;
i += j;
count++;
}
j *= 5;//第一遍隔5讀取 第二遍隔5*5讀取,下一次就是5*5*5,依次遞增
}
return tmp;
}
int main()
{
printf("%d\n", num(125));
printf("%d\n", num(25));
printf("%d\n", num(12));
printf("%d\n", num(0));
printf("%d\n", num(-1));
return 0;
}
測試一下代碼,結果如下:
至此,這道巧妙的題解決了。
總結
以上是生活随笔為你收集整理的小学 n 阶乘的后面包含多少零c语言,C语言---求n的阶乘后面有多少个连续的0的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言计算坐标三角形面积公式,c语言计算
- 下一篇: c语言标准io中可读可写,C语言标准IO