N!的位数

1、问题描述
     求N!的位数(HDU 1018
 
2、解题思路
     首先明确:N!的位数=logN! + 1(以10为底)
     因此,初期的思路是利用对数的性质:logN!=logN+log(N-1)+…………+log2+log1,求出logN!
                                                            为了节省计算时间,可以预先计算出每个logn
     后来看到网上的解题报告,首先使用stirling公式计算出N!的近似值(对于计算N!的位数的影响可以忽略不计),然后在计算logN!.
        
3、两种方法的实现代码
     ①计算对数
import java.util.Scanner;
public class poj_1423
{
     static int[] logn=new int[10000001];
     public static void calculate()
     {
           double d=0;
           forint i=1; i<10000001; i++)
          {
               d= d+Math. log10(i);
               logni]=( intd+1;
          }
     }
     public static void main(String[] args)
     {
           // TODO Auto-generated method stub
          calculate();
          Scanner in= new Scanner(System. in);
           int n= in.nextInt();
           whilen-->0)
          {
               int m= in.nextInt();
              System. out.println( lognm]);
          }
     }
}
 
   ②striling公式
     import java.util.Scanner;
     public class Main{
        public static int StirlingN(int n)
        {
          return (int)(Math.log10(2*Math.PI*n)/2+n*Math.log10(n/Math.E))+1;
        }
        public static void main(String[] args)
        {
                // TODO Auto-generated method stub
                Scanner in=new Scanner(System.in);
                int n=in.nextInt();
                while(n-->0)
                {
                        int m=in.nextInt();
                        System.out.println(StirlingN(m));
                }
        }

}
posted @ 2016-01-21 11:10  Westly  阅读(146)  评论(0)    收藏  举报