题目大意:求n!(1<=n<=10^7)的最高位数字
考察点:数论
思路分析:这题参考了伟神的博客http://blog.youkuaiyun.com/zhangwei1120112119/article/details/8565684
斯特林公式,则lgn!=lg(sqrt(2*pi*n))+n*lg(n/e)
算出lgn之后,因为整数部分与最高位无关,所以取小数部分做幂运算即可。
要注意的是当n比较小的时候斯特林公式误差比较大,此时可以用lgn!=lg1+lg2+……lgn来算。
#include<stdio.h>
#include<math.h>
#define PI acos(-1.0)
#define e exp(1.0)
int main()
{
int n,i,t;
double k;
scanf("%d",&t);
while (t--)
{
scanf("%d",&n);
k=0;
if (n<=1000)
{
for (i=1;i<=n;i++)
k+=log10(i*1.0);
}
else k=(log10(sqrt(2*PI*n*1.0)))+n*log10((n*1.0)/e);
k-=(int)k;
k=pow(10.0,1.0*k);
printf("%d\n",(int)k);
}
return 0;
}