POJ 1401 Factorial 解題報告

以下是算法的直觀解釋。
假設求60!的結果後面有幾個0。
由《編程之美》可知其實是求1,2,3……60中共有幾個5的因子,如,5有一個,10有兩個,……一起加起來即得到結果。但是如果一個一個這樣計算下去,會超時的。
其實還有更簡單的計算方法。
我們知道,在1->60的數中,以下的數可以被5整除:
5,10,15,20,25,30,35,40,45,50,55,60
共60/5 = 12(個)。
其中,
25,50可以被25整除,即25和50可以貢獻兩個5的因子。
即其中可以貢獻2個5的因子的個數爲60/25 = 2(個)。
貢獻3個5的因子的沒有了,因爲60/125 = 0。
所以共有12 + 2 = 14 (個)5的因子。(即1 * 10 + 2 * 2)

 

#include <iostream>
using namespace std;
int main()
{
    int T;
    cin >> T;
    __int64 N;
    for(int i = 0; i < T; i++)
    {
        cin >> N;
        int ret = 0;
        while(N) {
            ret = ret + N / 5;
            N = N / 5;
        }
        cout << ret << endl;
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章