HPU 1166: 阶乘问题(一)

1166: 阶乘问题(一) [数学]

时间限制: 1 Sec 内存限制: 128 MB

提交: 58 解决: 24 统计

题目描述

小H对阶乘!很感兴趣。现在他想知道N!N!的位数,由于NN太大了,所以请了你这个BestCoder来帮忙。

输入

第一行输入一个整数TT,代表有TT组测试数据。

每组数据输入一个整数NN

注:1<=T<=10,1<=N<=21061<=T<=10,1<=N<=2∗106

输出

对每组数据,输出N!N!的位数。

样例输入

2
100
1000

样例输出

158
2568

方法一:利用斯特林公式   n! approx sqrt{2pi n}\, left(frac{n}{e}
ight)^{n}.

#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(123n)=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;
}  


原文地址:https://www.cnblogs.com/Friends-A/p/9309028.html