北大 1423 Big Number

关于如何确定阶乘结果的位数呢,就是位数x可用由 10^(x-1)≤n!≤10^x,再取对数获得
最开始做的时候想法很简单,就是用个循环,因为log(n!)=log1+log2+。。。。。。+logn,所以加起来就好了。结果一提交,就是 time limit exceeded。于是就上网上去查找计算阶乘的其他方法,就找到了斯特灵公式。之后就是在纸上演算怎么样才能把这个式子表示出来了。
#include<iostream>
#include<math.h>
using namespace std;

int main()
{
    //N表示用户想输入几次,i为计数器
    int N,i;
    cin>>N;
    double in;
    double out;
    for(i=0;i<N;i++)
    {
        cin>>in;
        //斯特灵公式不适应1的情况,因此单独考虑
        if(in==1)
            cout<<1<<endl;
        else
        {
            //这就是斯特灵公式,“n!≈sqrt(2πn)(n/e)^n”
            //而求阶乘结果的位数x可用由 10^(x-1)≤n!≤10^x,再取对数获得。
            //因此利用log的性质写出了下面的式子
            //acos为反余弦,2*acos(0.0)为π
            //exp(1.0)是为了得到e,这个式子就是e^1
            out=(log10(sqrt(4*acos(0.0)*in))+in*(log10(in)-log10(exp(1.0))))+1;
            cout<<(int)out<<endl;
        }
    }
    return 0;
}

本文出自 “wing学习之路” 博客,请务必保留此出处http://wingstudy.blog.51cto.com/1655658/323851

你可能感兴趣的:(1421,Big Number,北大)