我們知道c語言是無法直接儲存100的階乘的,其實從17開始已經溢位,34開始之後都是0。所以這其實是一道數數問題。
首先,搞清楚原理。
兩數相乘怎樣才能產生0,很明顯只要是乙個偶數與5相乘就會產生1個0。因為在1到100中偶數明顯比5多,那麼只用考慮1到100有多少個5就可以了。
先來看5的倍數的情況
2 * 5 = 10也就是說當5和5的倍數出現時就會產生乙個0.但是當25出現時,情況不同了,因為25 = 5 * 5,此時出現了兩個5,那麼總能找到乙個偶數與其相乘得到兩個0。4 * 10 = 40 → 4 * 2 * 5 = 40
6 * 15 = 80 → 6 * 3 * 5 = 80
如 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...