1166: 阶乘问题(一) [数学]
时间限制: 1 Sec 内存限制: 128 MB提交: 58 解决: 24 统计
题目描述
小H对阶乘!很感兴趣。现在他想知道N!N!的位数,由于NN太大了,所以请了你这个BestCoder来帮忙。
输入
第一行输入一个整数TT,代表有TT组测试数据。
每组数据输入一个整数NN。
注:1<=T<=10,1<=N<=2∗1061<=T<=10,1<=N<=2∗106。
输出
对每组数据,输出N!N!的位数。
样例输入
2
100
1000
样例输出
158
2568
方法一:利用斯特林公式
#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
#define Pi acos(-1)
#define e exp(double(1))
using namespace std;
int main()
{
int t,n,sum;
cin>>t;
while(t--)
{
cin>>n;
sum=floor(log10(sqrt(2*Pi*n))+n*log10(n/e))+1;
//floor()向下取整。即取不大于x的最大整数
if(n==1) sum=1;
cout<<sum<<endl;
}
return 0;
}
方法二:无视公式,暴力
log10(n!)log10(n!)
=log10(1∗2∗3…∗n)=log10(1∗2∗3…∗n)
=log10(1)+log10(2)+…+log10(n)
#include<cstdio>
#include<cmath>
int main()
{
int n,i,t;
double d;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=1,d=0;i<=n;i++) d+=log10(i);
printf("%d
",(int)d+1);
}
return 0;
}