I and OI
Past...

题意:求N阶乘的位数.

分析:用斯特林近似公式求阶乘.一个数Num的位数=[lg(Num)]+1.

斯特林近似公式:N!≈(2*pi*N)^0.5*(n/e)^n.

于是N!的位数=ln((2*pi*N)^0.5*(n/e)^n)/ln(2).

用一些对数变换防止溢出.

code:

const e=2.71828182;
      pi=3.1415926;
      ln10=ln(10);
      lnpi=ln(pi);
      ln2=ln(2);

var   datanum,d,n:longint;
      ans1,ans2,lnn:extended;

begin
      readln(datanum);
      for d:=1 to datanum do
      begin
            readln(n);
            lnn:=ln(n);
            ans1:=(ln(2)+ln(pi)+lnn)/2;
            ans2:=n*lnn-n;
            writeln(trunc((ans1+ans2)/ln10)+1);
      end;
end.

posted on 2011-08-10 15:34  exponent  阅读(320)  评论(0编辑  收藏  举报