程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> poj 1401 Factorial

poj 1401 Factorial

編輯:C++入門知識

 這個題目是求N!後面有多少個0,注意N可能最大到10的9次。哈哈,直接枚舉1-N有多少個2和5的因子,然後取小的值肯定會超時的。
但是,我還是試了下,果斷超時了。
   那就只有想數學結論了,果斷想到1-N中能被2整除的數字有N / 2。哈哈,再往後思考下,發現1-N中能被4整除的數字有N / 4個,再往後
就是N / 8,一直到N 除以2的某個次方為0為止,那麼把所有的值加起來就是2的因子的個數了。求5的因子的個數也是這樣的方法了。
   很明顯,5的因子的個數一定會小於等於2的因子的個數。那麼直接求5的因子的個數就行了。由於,N / 5的時候用到了向下取整,
所以不能用等比數列求和公式,怎麼把答案弄成一個公式,還不知道了。
   PS:其實我這種思路的靈感來自於篩選素數的方法了。

代碼如下:
#include <stdio.h>
#include <algorithm>
#include <math.h>
using namespace std;

int GetAns(int nN)
{
    int nAns = 0;
    while (nN)
    {
        nAns += nN / 5;
        nN /= 5;
    }
    return nAns;
}

int main()
{
    int nT;

    scanf("%d", &nT);
    while (nT--)
    {
        int nN;
        scanf("%d", &nN);
        printf("%d\n", GetAns(nN));
    }
   
    return 0;
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved