求一个数的阶乘有几个数位 stirling公式:n! = ((2*pi*n)^(1/2))*((n/e)^n); 前提是n > 3 求有多少数位,求以10为底的对数,向下取整,再加上1即可 代码: //Stirling公式: n! = ((2*pi*n)^(1/2))*((n/e)^n); 前提是n > 3 //由此可以导出lg(n!) = (lg(2*pi)+lg(n))/2 + n*(lg(n)-lg(e)); #include<iostream> #include<cmath> using namespace std; int stirling(int n) { const double p=acos(-1.0); double c1=log10(2*p); double c2=0.434294481903;//log10(e) double c3=log10(1.0*n); int s=1; if(n>3) s=(c3+c1)/2+n*(c3-c2)+1; return s; } int main() { int m,n; double ans; const double pi =3.141592653589793239; const double e=exp(1.0) ; cin>>m; while(m--) { cin>>n; //ans=sqrt(2*pi*n)*((pow(n/e,n))); //n=(int)(log10(ans+1e-7))+1; cout<<stirling(n)<<endl; } return 0; }