题目链接: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