用數學思維解決高階階乘問題

2021-07-31 05:33:49 字數 703 閱讀 6473

題目:用c語言求出任意的n!的末尾有多少個0。

思考:第一步:0的個數的本質。任意的數的階乘,如果真的把階乘算出來再去數有多少個0,如果數量太大,即使是計算機也是非常吃力的。那這個時候就不能盲目,要用數學的方法去解決問題。其實,有多少個,就是問有多少個10相乘,而每乙個2*5就會有個10。而2的數量是很多的,那也就是說,有多少個5,就會有多少個10,也就是階乘後面會有多少個0。

第二步:5的個數的統計。5的倍數中,25有2個5,125中有三個5,以此類推。這就不能單純的整除5來解決問題。但是,可以一步一步算,即先算出從1到n的5的倍數有多少個,然後,再算出25的個數,125的個數,625的個數,以此類推。例如

2000!的5的數量

2000 /5 =400   2000個數種,有400個是5的倍數

400 / 5 =80        這400個數種,有80個是25的倍數

80 / 5 =16         這80個數中,有16個是125的倍數

16 / 5 = 3        這16個數中,有3個是625的倍數

3<5    就沒有了

則總共5的個數為 400+80+16+3=499個

**實現為

#include

void main()

printf("有%d個0\n",i);

}**是非常簡單的。由此可見,運用好數學思維,可以快速解決問題,大大提高計算機的運算效率。

用斯特林數解決階乘位數問題(很有用

利用斯特林 stirling 公式的進行求解大數階乘的位數。下面是推導得到的公式 res long log10 sqrt 4.0 acos 0.0 n n log10 n log10 exp 1.0 1 當n 1的時候,上面的公式不適用,所以要單獨處理n 1的情況!有關斯特林 stirling 公式...

思維問題解決

1.問題描述 對於長度為n的數列 該數列的元素為1 n 從裡面選出m個特殊數,另外對該數列進行分頁處理 每一頁的長度為k 我們每一次對一頁中的所有特殊數字進行清除處理,從頭遍歷每一頁,清除該頁的特殊數字,另外清除了數字,後面所有的數字會往前替補。求需要處理多少次 清除含特殊數字的頁數的次數 舉例 n...

用springAOP解決許可權問題

1.service層 public inte ce personservice public class personserviceimpl implements personservice privilegeinfo name updateperson public void updatepers...