杭电acm 1018 Big Number

做本题前的引入:(1).斯特林公式(Stirling公式):lnN!=NlnN-N+0.5*ln(2*N*pi)

        (2).ceil函数(与之对应floor函数)

        (3).log函数内必需指明类型

        (4).log10(100)意义:以10为底,100为真数。

法一:

#include<iostream>

#include<cmath>

using namespace std;

const double PI=acos(-1.0);

int main()

{

      int t,n;

      cin>>t;

      while(t--)

      {

           cin>>n;

           int num=0;

           num=ceil((n*log(double(n))-n+0.5*log(double(2*PI*n)))/log(double(10)));

           cout<<num<<endl;

      }

      return 0;

}

法二:

#include<iostream>

#include<cmath>

using namespace std;

int main()

{

      int t;

      cin>>t;

      while(t--)

      {

           int n;

           cin>>n;

           double sum=log10(double(n));

           while(--n)

                 sum+=log10(double(n));

           cout<<int(sum)+1<<endl;

      }

}

两者相比,用斯特林公式,时间好得多(无循环)。

posted @ 2012-09-30 20:56  MegamindLS  阅读(1105)  评论(0编辑  收藏  举报