标签:
数学公式推导
方法一:
①:10^M < n! <10^(M+1) 若求得M,则M+1即为答案。
对公式①两边以10为底取对数
M < log10(n!) < M+1
因为 log10(n!)=log10(1)+log10(2)+……+log10(n)
可用循环求得M+1的值
#include<iostream> #include<cstdio> #include<cmath> using namespace std; int main() { int T; cin>>T; while(T--) { int n; cin>>n; double ans=0; for(int i=1;i<=n;i++) { ans+=log(i)/log(10); } cout<<(int)ans+1<<endl; } return 0; }
方法二:斯特林公式
n! ≈ sqrt(2*n*pi)*(n/e)^n
则 M+1=(int)(0.5*log(2.0*n*PI)+n*log(n)-n)/(log(10.0)) )+1;
#include<iostream> #include<cstdio> #include<cmath> using namespace std; const double PI=3.1415926; int main() { int T; cin>>T; while(T--) { int n; cin>>n; double ans; ans=(0.5*log(2.0*n*PI)+n*log(n)-n)/(log(10.0)); cout<<(long)ans+1<<endl; } return 0; }
标签:
原文地址:http://www.cnblogs.com/program-ccc/p/4690303.html