#include <iostream>
#include <math.h>
#define maxn 100001
const double e = 2.7182818284590452354, pi = 3.141592653589793239;
double biao[maxn];
using namespace std;
main()
{
int i;
biao[0]=0.0;
for(i=1;i<maxn;i++)
biao[i]=log10((double)i)+biao[i-1];
int n;
cin >>n;
while(n--)
{
int t;
double ans;
cin>>t;
if(t<maxn)
ans=biao[t];
else{
ans=log10(sqrt(2*pi*t))+t*log10(t/e);
}
cout<<(int)ans+1<<endl;
}
return 0;
}
#include <math.h>
#define maxn 100001
const double e = 2.7182818284590452354, pi = 3.141592653589793239;
double biao[maxn];
using namespace std;
main()
{
int i;
biao[0]=0.0;
for(i=1;i<maxn;i++)
biao[i]=log10((double)i)+biao[i-1];
int n;
cin >>n;
while(n--)
{
int t;
double ans;
cin>>t;
if(t<maxn)
ans=biao[t];
else{
ans=log10(sqrt(2*pi*t))+t*log10(t/e);
}
cout<<(int)ans+1<<endl;
}
return 0;
}
用n=log1+log2……logn,会超时,借鉴别人的,解题报告看到了一种方法就是使用
Stirling公式。
![\begin{displaymath}n!](http://www.sosmath.com/calculus/sequence/stirling/img1.gif)
但是这个是一个在n趋近于无穷的是后的公式,所以先还是要用前面的等到可能要超界了是后才用stirling公式。
C语言版本~~~
#include<stdio.h>
#include<math.h>
#define PI 3.14159265
int main(){
int len,N;
int k;
scanf("%d",&k);
while(k--)
{
scanf("%d",&N);
if(N==1)
len=1;
else
len=(int)ceil((N*log(N)-N+log(2*N*PI)/2)/log(10));
#include<math.h>
#define PI 3.14159265
int main(){
int len,N;
int k;
scanf("%d",&k);
while(k--)
{
scanf("%d",&N);
if(N==1)
len=1;
else
len=(int)ceil((N*log(N)-N+log(2*N*PI)/2)/log(10));
printf("%d\n",len);
}
return 0;
}
}
return 0;
}
ceil求上界,即不小于某值的最小整数
转载于:https://blog.51cto.com/merry/137210