题目意思:给你个n( 1 ≤ n ≤ 10^7 ),求n!的位数
方法一: 一开始是用大数的阶乘方法求,结果超时了,这个方法求不出10^7这么大的阶乘,百度了一下后发现有公式直接求
int result[4000];
int h;//最高位
int factorial(int num){
memset(result,0,sizeof(result));
h = 1;
result[0] = 1;
for(int i=1;i<=num;i++){
int res = 0;
for(int j=0;j<h;j++){
int b = result[j]*i + res;
result[j] = b%10;
res = b/10;
}
while(res){
result[h++] = res%10;
res /= 10;
}
}
return h;
}
方法二: 斯特林公式
res = (int)(log10(sqrt(2PIn))+n*log10(n/e))+1
int Stirling(int n){//斯特拉公式
double PI = acos(-1);
double e = exp(1);
return (int)(log10(sqrt(2*PI*n))+n*log10(n/e))+1;
}
方法三: res = log10(N!)+1
int digit(int n){
double sum = 0;
for(int i=1;i<=n;i++){
sum += log10(i);
}
return (int)(sum+1);
}