数的长度
时间限制:3000 ms | 内存限制:65535 KB
难度:1
描述
N!阶乘是一个非常大的数,大家都知道计算公式是N!=N*(N-1)······*2*1.现在你的任务是计算出N!的位数有多少(十进制)?
输入首行输入n,表示有多少组测试数据(n<10)
随后n行每行输入一组测试数据 N( 0 < N < 1000000 )输出对于每个数N,输出N!的(十进制)位数。样例输入3
1
3
32000
样例输出1
1
130271
来源ACM教程
/*
* 数的长度
* 看到此题首先想到的以前看到过类似题的公式
* 就是套用公式的简单题
* 上网搜到这是 斯特林公式:
* 求n!的位数
* 利用斯特林(Stirling)公式的进行求解。下面是推导得到的公式:
res=(long)( (log10(sqrt(4.0*acos(0.0)*n)) + n*(log10(n)-log10(exp(1.0)))) + 1 );
当n=1的时候,上面的公式不适用,所以要单独处理n=1的情况!
*
*/
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
while (n-- > 0) {
System.out.println(f(sc.nextInt()));
}
}
// 大数阶乘的位数公式
static int f(int n) {
double p = Math.acos(-1.0);
double c1 = Math.log10(2 * p);
double c2 = 0.434294481903;
double c3 = Math.log10(1.0 * n);
int s = 1;
if (n > 3)
s = (int) ((c3 + c1) / 2 + n * (c3 - c2) + 1);
return s;
}
}