我们知道整数n的位数的计算方法为:log10(n)+1
故n!的位数为log10(n!)+1
如果要求出n!的具体值,对很大的n,计算会很慢,如果仅仅是求阶乘的位数,可以用斯特林(Stirling)公式求解
斯特林(Stirling)公式:
于是求n!的位数就是求log10((2*PI*n)^1/2*(n/e)^n)+1
即 1/2*log10(2*PI*n)+n*log10(n/e)+1
import java.math.BigInteger; import java.util.Scanner; public class ShuDeChangDu { public static void main(String[] args) { Scanner input=new Scanner(System.in); int n=input.nextInt(); while(n-->0){ int N=input.nextInt(); //方法一超时: /*BigInteger sum=BigInteger.ONE; for(int i=1;i<=N;i++){ sum=sum.multiply(BigInteger.valueOf(i)); } System.out.println(sum.toString().length());*/ //方法二:count=log10(N!)=log(1)+log(2)+...log10(N) double count=1; for(double i=1;i<=N;i++){ count= (count+Math.log10(i)); } System.out.println((int)count); } } }
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#define PI 3.141592654
#define E 2.71828182846
int length(int n)
{
int s=1;
if(n>3)
s=log10(2*PI*n)/2+n*log10(n/E)+1; //斯特林公式,估算阶乘位数
return s;
}
int main()
{
int m,n;
scanf("%d",&m);
while(m)
{
scanf("%d",&n);
n=length(n);
printf("%d\n",n);
m--;
}
return 0;
}