阶乘的最高位
时间限制: 1 Sec 内存限制: 128 MB
题目描述
输入一个正整数n。输出n!的最高位上的数字。
输入
输入一个正整数n(n不超过1000)。
输出
输出n!的最高位上的数字。
样例输入
1000
样例输出
4
以下解释转载自:http://wenda.haosou.com/q/1378770028060059
设N!=x.yzzyz*10^kx=1~9取以10为底的对数log(N!)=k+log(x.yzzyz)
可见x.yzzyz=10^( log(N!)-(int)log(N!));
x=(int)(10^( log(N!)(int)log(N!)));
log(N!)=log(1)+....+.....+log(N)也就是说先计算以10为底的log(N!)
算好了求得它的整数部分(int) log(N!)
然后获得小数部分( log(N!)-(int)log(N!))
然后求10的方幂 pow(10,( log(N!)-(int)log(N!)));
然后取整就得到了(int)pow(10,( log(N!)-(int)log(N!)));
#include<stdio.h>
#include<math.h>
int main()
{
int n,i,first;
int a[5]= {1,1,2,6,4};
double sum=0;
scanf("%d",&n);
if(n<5) //前几位有误差,用数组先存起来
{
printf("%d\n",a[n]);
return 0;
}
for(i=1; i<=n; i++)
sum+=log(1.0*i)/log(10.0);
sum-=(int)sum;
first=exp(sum*log(10.0));
printf("%d\n",first);
return 0;
}