您的位置:首页 > 其它

杭电acm 1018 Big Number

2014-02-05 13:43 351 查看



杭电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;
}

主要是使用了下面这个公式:

log10(n!)=log10(1*2*3…*n)=log10(1)+log10(2)+…+log10(n)

注意:

这边的result要用double值,精度比较高,我wrong了一次就因为把它设成float值了

法二:
#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;
      }
}
两者相比,用斯特林公式,时间好得多(无循环)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: