数的长度
时间限制: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; } }
