[POJ1423]Stirling公式的应用

Stirling公式:

  n!约等于sqrt(2*pi*n)*(n/e)^n

  另外,e约等于2.71828182845409523...

  试了一下发现math库里面并不能像pi一样直接调e但是发现挺好记的。。>_<

 


 

POJ1423

  题面很简单,就是让我们计算n!的位数。

  我们知道十进制数的位数=trunc(ln(n)/ln(10))+1

  而对于n=a*b,ln(n)=ln(a)+ln(b)

  所以ln(sqrt(2*pi*n)*(n/e)^n)=ln(sqrt(2*pi*n))+n*ln(n/e),对于每个询问就可以O(1)求出位数辣!

 

 1 program poj1423;
 2 const e=2.7182818284590452354;
 3 var t,test,n:longint;
 4 begin
 5     readln(test);
 6     for t:=1 to test do 
 7     begin
 8         readln(n);
 9         writeln(trunc((n*ln(n/e)+ln(sqrt(2*pi*n)))/ln(10))+1);
10     end;
11 end.

 

posted @ 2015-03-27 18:18  mjy0724  阅读(194)  评论(0编辑  收藏  举报