HDOJ1018 big number 斯特林公式

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1018

题目的要求就是求出给定数的阶乘的位数。

阶乘的增长是指数型的,使用暴力法显然是不行的。

方法1:可以使用logn*m = logn+logm的公式去求解


import java.util.Scanner;
 
public class Main{
    private static Scanner scanner;
 
    public static void main(String[] args) {
        scanner = new Scanner(System.in);
        int cases = scanner.nextInt();
        while (cases-- > 0) {
            int n = scanner.nextInt();
            double s = 0;
            for (int i = 1; i <= n; i++) {
                s += Math.log10(i);
            }
            System.out.println(((int) s) + 1);
        }
    }
}

方法二:使用斯特林公式去求解
斯特林公式为

有更精确的,但是我们使用这个取整就行。 
这个公式化为log sqrt(2*PI*n)+n*log(n/e) 

 import java.util.Scanner;
 
//AC 使用斯特林公式,效率更高!!
public class Main{
    private static Scanner scanner;
 
    public static void main(String[] args) {
        scanner = new Scanner(System.in);
        int cases = scanner.nextInt();
        while (cases-- > 0) {
            int n = scanner.nextInt();
            // 注意:不是用Math.log,而是用Math.log10
            double s = Math.log10(Math.sqrt(2 * Math.PI * n)) + n * Math.log10(n / Math.E);
            System.out.println(((int) s) + 1);
        }
    }
}

虽然第一种方法也能过,但是第二种方法更为高效 
Run ID    Submit Time    Judge Status    Pro.ID    Exe.Time    Exe.Memory    Code Len.    Language    Author
23027295    2017-11-26 23:09:11    Accepted    1018    249MS    9508K    419 B    Java    逸川同学
23027207    2017-11-26 23:00:35    Accepted    1018    904MS    9512K    375 B    Java    逸川同学

另外,补充一下何解任意一个正整数a的位数等于(int)log10(a) + 1(从一个大神学长里转来的)

对于任意一个给定的正整数a,
  假设10^(x-1)<=a<10^x,那么显然a的位数为x位,
  又因为
  log10(10^(x-1))<=log10(a)<(log10(10^x))
  即x-1<=log10(a)<x
  则(int)log10(a)=x-1,
  即(int)log10(a)+1=x
  即a的位数是(int)log10(a)+1

原文链接 https://blog.csdn.net/qq_26754655/article/details/80186382

猜你喜欢

转载自blog.csdn.net/lmhlmh_/article/details/86754813