java算法-数的长度(斯特林公式)


数的长度

时间限制: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;
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值