c語言實現求100(n)的階乘尾部有多少連續的0

2021-10-12 10:33:26 字數 1740 閱讀 9783

我們知道c語言是無法直接儲存100的階乘的,其實從17開始已經溢位,34開始之後都是0。所以這其實是一道數數問題。

首先,搞清楚原理。

兩數相乘怎樣才能產生0,很明顯只要是乙個偶數與5相乘就會產生1個0。因為在1到100中偶數明顯比5多,那麼只用考慮1到100有多少個5就可以了。

先來看5的倍數的情況

2 * 5 = 10

4 * 10 = 40 → 4 * 2 * 5 = 40

6 * 15 = 80 → 6 * 3 * 5 = 80

也就是說當5和5的倍數出現時就會產生乙個0.但是當25出現時,情況不同了,因為25 = 5 * 5,此時出現了兩個5,那麼總能找到乙個偶數與其相乘得到兩個0。

如 12 * 25 = 300

同樣25的倍數與偶數相乘也會出現2個0.那麼把25看成52 .因為53已經超出100,所以只用考慮25及其倍數。

如此已經可以用**實現了,只要n%5為0,計數器+1,同時n%25為0,計數器再+1(25及其倍數本身就是5的倍數,所以只用+1次)

int i,cnt;

cnt=0;

for(i=

1;i<

101;

++i)}}

printf

("100的階乘尾部有%d個0.\n"

,cnt)

;

執行結果

但是,這段**一股翔味顯得過於累贅,當我們了解原理後,一行**就可以實現。

printf

("100的階乘尾部有%d個0.\n"

,100/5

+100/25

);

基於以上實現求100階乘尾部0個個數,求任意n的階乘尾部0的個數就很容易了,只要把5的次冪全部考慮在內就可以,此處只實現n為整型。

int i=

5,sum=

0,x;

printf

("input:\n");

scanf

("%d"

,&x)

;for(;i>

0;i*=5)

break;}

}printf

("%d\n"

,sum)

;

以上**是將n劃為[5,25),[25,125)……的區間求和,防止越界,最外層迴圈加入了i>0的條件。break減少運算次數。

執行結果

當然也有一行**實現,小於231-1的最大5的次冪是513 = 1220703125,所以如下

printf

("%d"

,x/5

+x/25

+x/125

+x/625

+x/3125

+x/15625

+x/78125

+x/390625

+x/1953125

+x/9765625

+x/48828125

+x/244140625

+x/1220703125

);

C語言求n的階乘(n!)

c語言求n的階乘 n!joprant7 從鍵盤輸入乙個數,求出這個數的階乘,即 n 演算法思想 首先要清楚階乘定義,所謂 n 的階乘,就是從 1 開始乘以比前乙個數大 1 的數,一直乘到 n,用公式表示就是 1 2 3 4 n 2 n 1 n n 具體的操作 利用迴圈解決問題,設迴圈變數為 i,初值...

C語言求n的階乘(n )

從鍵盤輸入乙個數,求出這個數的階乘,即 n 首先要清楚階乘定義,所謂 n 的階乘,就是從 1 開始乘以比前乙個數大 1 的數,一直乘到 n,用公式表示就是 1 2 3 4 n 2 n 1 n n 具體的操作 利用迴圈解決問題,設迴圈變數為 i,初值為 1,i 從 1 變化到 n 依次讓 i 與 su...

C語言 遞迴求n的階乘

例30 c語言求n!要求用遞迴實現。解題思路 本題和例29思想差不多,都是用遞迴來實現,讀者可以回顧一下 c語言遞迴求年齡 求階乘函式 int factorial int number 自定義階乘函式 else if number 0 number 1 0或者1本身的階乘是1 else return...