1. 问题描述:(这道题目是计蒜客2019 蓝桥杯省赛 A 组模拟赛)
蒜头君对阶乘产生了兴趣,他列出了前 1010 个正整数的阶乘以及对应位数的表:
nn n!n! 位数 1 1 1 2 2 1 3 6 1 4 24 2 5 120 3 6 720 3 7 5040 4 8 40320 5 9 362880 6 10 3628800 7 对于蒜头君来说,再往后就很难计算了。他试图寻找阶乘位数的规律,但是失败了。现在请你帮他计算出第一个正整数的阶乘位数大于等于 1000010000 的数是多少,即求最小的正整数 nn满足 n!n! 的位数大于等于 1000010000。
样例输入复制
无
样例输出复制
无
2. 对于结果位数为1000位的阶乘我们是不能够很轻松地计算出来的,所以使用常规的方法是求解不出来的,这个时候需要借助于数学上的一个小公式:
log10(N)+1就是阶乘N的位数,然后使用循环来模拟这个过程就好了,还需要知道的是对数相加真数是相乘的数学知识,所以在循环中对数相加就可以了,这样就可以计算出N的阶乘了,然后取对数就可以了
此外Java中没有直接提供对于以10为底数的对数我们需要借助于数学上的换底公式进行转换
public static double log(int basement, int n){
return Math.log(n) / Math.log(basement);
}
3. 具体的代码如下:
public class Main {
public static void main(String[] args) {
double ans = 0;
int flag = 0;
for(int i = 1; i <= 1000000; i++){
ans = 0;
for(int j = 1; j <= i; j++){
ans += (Math.log(j) / Math.log(10));
}
if(ans + 1 >= 10000){
flag = i;
break;
}
}
System.out.println(flag);
}
}