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

    xiaoxiao2021-03-26  19

    数的长度

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

    转载请注明原文地址: https://ju.6miu.com/read-659764.html

    最新回复(0)