日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

小学 n 阶乘的后面包含多少零c语言,C语言---求n的阶乘后面有多少个连续的0

發(fā)布時(shí)間:2024/9/30 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 小学 n 阶乘的后面包含多少零c语言,C语言---求n的阶乘后面有多少个连续的0 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

C語(yǔ)言---求n的階乘后面有多少個(gè)連續(xù)的0

題目描述:給定一個(gè)正整數(shù)n,返回n的階乘尾部連續(xù)0的個(gè)數(shù)。

例如:(5,5*4*3*2*1=120,則返回1),(10,10*9*8*7*6*5*4*3*2*1=3628800,則返回2)

題目分析:首先拿到這道題,直接可以想到最簡(jiǎn)單的方法就是,通過(guò)循環(huán)算出這個(gè)值,然會(huì)取個(gè)位,減個(gè)位,統(tǒng)計(jì)一下個(gè)數(shù)即可。但是運(yùn)行后就發(fā)現(xiàn)不可行,因?yàn)槿绻鹡稍微大一點(diǎn),則算出的這個(gè)值就太大了,保存不了,且運(yùn)行超時(shí),所以這種方法不可行。

于是就得想別的方法了,最后上網(wǎng)查資料發(fā)現(xiàn)還有一種巧妙的解法,那就是將可以造成尾部出現(xiàn)0的情況進(jìn)行分析,發(fā)現(xiàn)10可以由2*5造成,發(fā)現(xiàn)20可以由2*2*5造成,發(fā)現(xiàn)100可以由2*2*5*5造成。。。

多試幾組數(shù)據(jù),可以發(fā)現(xiàn)其規(guī)律:尾部0的個(gè)數(shù)等于min{2的個(gè)數(shù),5的個(gè)數(shù)}

因?yàn)槲膊康?是由2*5得來(lái)的,雖然也可能是4*5得來(lái)的,但是4也是由2*2得來(lái)的,所以尾部的0根本上是由2*5得來(lái)的。

這里可以發(fā)現(xiàn):一對(duì)2和5可以造成尾部一個(gè)0,n對(duì)2和5可以造成尾部n個(gè)0,但是由于2可以由太多太多的數(shù)據(jù)分解得來(lái),所以我們這里主要看5的個(gè)數(shù)主要由哪些數(shù)分解得來(lái)即可:

比如:

5!= {1 * 2 * 3 * 4 * 5} 這里只有1個(gè)5,分別是5

10!= {1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10} 這里有2個(gè)5,分別是5,10(10是由2*5組成的)

...

25!= {1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * ... * 21 * 22 * 23 * 24 * 25} 這里有6個(gè)5,分別是 5,10,15,20,25(25是由5*5組成的,所以25算2個(gè)5)

...

125!= {1 * 2 * 3 * 4 * 5 * ... * 25 * ... * 50 * ... * 75 * ... * 100 * ... * 121 * 122 * 123 * 124 * 125}這里有31個(gè)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組成,算兩個(gè)5,而125是由5*5*5組成的,所以125單獨(dú)算三個(gè)5)

我們可以發(fā)現(xiàn)每隔上5個(gè)數(shù)會(huì)出現(xiàn)一個(gè)5,隔上25個(gè)數(shù)又單獨(dú)多出來(lái)一個(gè)5,隔上125個(gè)數(shù)又單獨(dú)多出來(lái)兩個(gè)5...

所以我們可以這樣編寫(xiě)代碼:

①:首先可以從1 -> n隔上5個(gè)數(shù)抽取一次,獲取這些數(shù)組成一個(gè)數(shù)列

②:如果上面數(shù)列的個(gè)數(shù)>=5,就再?gòu)纳厦鏀?shù)列中再隔上5個(gè)數(shù)抽取一次,獲取這些數(shù)組成一個(gè)新的數(shù)列

⑤:如果上面數(shù)列的個(gè)數(shù)>=5,就再?gòu)纳厦鏀?shù)列中再隔上5個(gè)數(shù)抽取一次,獲取這些數(shù)組成一個(gè)新的數(shù)列(直到獲取的數(shù)列中的數(shù)的個(gè)數(shù)小于5,則停止)

例如求125的階乘后面有多少連續(xù)的0:

這里用tmp統(tǒng)計(jì)5出現(xiàn)的個(gè)數(shù)

①:第一遍獲取可以得到單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

②:因?yàn)槠鋫€(gè)數(shù)肯定 >= 5,所以進(jìn)行第二遍獲取可以得到5*5:{25,50,75,100,125},所以tmp = 25 + 5 = 30

③:因?yàn)槠鋫€(gè)數(shù)剛剛好 == 5,所以進(jìn)行第三遍獲取可以得到5*5*5:{125},

所以tmp = 25 + 5 + 1 = 31

④:因?yàn)槠鋫€(gè)數(shù)肯定 <=5,所以不進(jìn)行第四遍獲取,直接退出循環(huán)即可。

所以我們可以得到125的階乘后面有31個(gè)連續(xù)的0

C語(yǔ)言代碼如下:

#include

int num(int n)

{

if(n < 0)//只要正整數(shù),防止負(fù)數(shù)

{

return -1;

}

int i = 0;

int j = 5;//逐層按 5 5*5 5*5*5 進(jìn)行抽取

int count = n;//統(tǒng)計(jì)逐次抽出了多少個(gè)數(shù),初始值個(gè)數(shù)為總體個(gè)數(shù)

int tmp = 0;//統(tǒng)計(jì)5的個(gè)數(shù)

while(count >= 5)

{

count = 0;//進(jìn)來(lái)后第一件事,讓其先歸零,重新統(tǒng)計(jì)抽取個(gè)數(shù)

i = 0;//進(jìn)來(lái)后第一件事,也讓i歸零,因?yàn)閕要從頭開(kā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;

}

測(cè)試一下代碼,結(jié)果如下:

至此,這道巧妙的題解決了。

總結(jié)

以上是生活随笔為你收集整理的小学 n 阶乘的后面包含多少零c语言,C语言---求n的阶乘后面有多少个连续的0的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。