杭电acm 1018 Big Number

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

      }

}

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值