题目:求一个数的阶乘的数字个数。如10! = 3 628 800,结果共有7个数字。输入m,1<=m<=10^7,输出m的阶乘m!的数字个数。
解题思路:
1 设n!的结果共有x位数字,则n!<10^x,两边取对数,则log(n!)<xlog(10),(对数的底为e)
2 利用斯特林公式快速求n的阶乘的近似值,斯特林公式如下:
两边取对数,得log(n!)=nlog(n)-n+0.5log(2πn) ---式1
由 log(n!)<xlog(10) 得(nlog(n)-n+0.5log(2πn))/log(10) < x ---式2
求出式2的左边,向上取整则得到x。
代码:
#include<stdio.h>
#include<math.h>
#define PI 3.14159265
int main()
{
int n,m,i;
double ceilNum;
scanf("%d", &n);
for(i=0; i<n; i++)
{
scanf("%d", &m);
//斯特林公式不适用于1,单独处理
if(m==1) printf("%d\n",1);
else
{
ceilNum=ceil((m*log(m)-m+0.5*log(2*PI*m))/log(10));
printf("%d\n",(int)ceilNum);
}
}
return 0;
}