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;
for( int i=1; i<10000001; i++)
{
d= d+Math. log10(i);
logn[ i]=( int) d+1;
}
}
public static void main(String[] args)
{
// TODO Auto-generated method stub
calculate();
Scanner in= new Scanner(System. in);
int n= in.nextInt();
while( n-->0)
{
int m= in.nextInt();
System. out.println( logn[ m]);
}
}
}
②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));
}
}
}
耐得住寂寞才能守住繁华,该奋斗的年龄不要选择了安逸

浙公网安备 33010602011771号