首页 > 代码库 > HDU 1018 Big Number

HDU 1018 Big Number

题意:给你一个数,计算他的阶乘有多少位。


算阶乘再看位数必超时。1<=n<=1e7。


想每次%10 。一开始用int 果然有精度问题。于是double水了。600+ms


后来想到可以 log 10 () 。于是900+ms。


总觉得不对。应该有公式。看discuss 后终于知道了。


#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<stack>
#include<iostream>
#include<list>
#include<set>
#include<cmath>

#define INF 0x7fffffff
#define eps 1e-8
#define PI 3.141592654
#define LL long long
#define debug puts("==fuck==")
#define acfun std::ios::sync_with_stdio(false)

using namespace std;

//int main()
//{
//    int m;
//    scanf("%d",&m);
//    while(m--)
//    {
//        int n;
//        scanf("%d",&n);
//        int s=1;
//        double c=1;
//        for(int i=2;i<=n;i++)
//        {
//            c*=i;
//            while(c>=10)
//            {
//                c/=10;
//                s++;
//            }
//        }
//        printf("%d\n",s);
//    }
//}
//687MS
//int main()
//{
//    int m;
//    double s;
//    scanf("%d",&m);
//    while(m--)
//    {
//        int n;
//        scanf("%d",&n);
//        s=1.0;
//        for(int i=1;i<=n;i++)
//        s+=log10(i);
//        printf("%d\n",(int)s);
//    }
//    return 0;
//}
//968MS
#define E 2.71828182845904523536028747135266250
int main()
{
    int m;
    scanf("%d",&m);
    while(m--)
    {
        int n;
        scanf("%d",&n);
        double s=log10(sqrt(2*PI*n))+n*log10(n/E);
        printf("%d\n",(int)s+1);
    }
}
//0ms


HDU 1018 Big Number