cugoj 1017

weixin_33860553發表於2012-07-08

一個模版:
算n的階乘末尾0的個數,但是數字較大的時候則比較麻煩,可以通過如下原理反覆的除以5得到最後的結果:

原理是:  
    假如你把1×2×3×4×……×N中每一個因數分解質因數,結果就像:  
    1 × 2 × 3 × (2 × 2) × 5 × (2 × 3) × 7 × (2 × 2 ×2) ×……  
    10進位制數結尾的每一個0都表示有一個因數10存在——任何進位制都一樣,對於一個M進位制的數,讓結尾多一個0就等價於乘以M。  
    10可以分解為2 × 5——因此只有質數2和5相乘能產生0,別的任何兩個質數相乘都不能產生0,而且2,5相乘只產生一個0。  
    所以,分解後的整個因數式中有多少對(2,   5),結果中就有多少個0,而分解的結果中,2的個數顯然是多於5的,因此,有多少個5,就有多    少個(2,   5)對。  
    所以,討論1000的階乘結尾有幾個0的問題,就被轉換成了1到1000所有這些數的質因數分解式有多少個5的問題。  
    5的個數可以用下面那個式子算出
ac code:
 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int T,n;
 6     cin>>T;
 7     while(T--)
 8     {
 9         cin>>n;
10         int sum=0;
11         for(int i=5;i<=n;i=i*5)
12         {
13             sum+=n/i;
14         }
15        cout<<sum<<endl;
16     }
17     return 0;
18 }