题目大意:求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;
}
本文介绍了一种利用斯特林公式快速计算任意大小整数n(1≤n≤10^7)阶乘的最高位数字的方法,通过分析小数部分进行精确计算,并特别考虑了当n较小时斯特林公式误差较大的情况,提供了准确的算法实现。
1万+

被折叠的 条评论
为什么被折叠?



