计算n!的位数<Math>
题意:如题目.
方法一:<TLE>
* 可设想n!的结果是不大于10的M次幂的数,即n!<=10^M(10的M次方),则不小于M的最小整数就是 n!的位数,对
* 该式两边取对数,有 M =log10^n! 即:M = log10^1+log10^2+log10^3...+log10^n 循环求和,就能算得M值,
* 该M是n!的精确位数。当n比较大的时候,这种方法方法需要花费很多的时间。
*
#include<iostream> #include<cstdio> #include<cmath> using namespace std; int main () { int n; double sum; while(scanf("%d",&n)!=EOF) { sum=1; for(int i=2;i<=n;i++) sum+=log10(i); printf("%d\n",(int)sum); } return 0; }
* 方法二:
* 利用斯特林(Stirling)公式的进行求解。下面是推导得到的公式:
* res=(long)( (log10(sqrt(4.0*acos(0.0)*n)) + n*(log10(n)-log10(exp(1.0)))) + 1 );
* 当n=1的时候,上面的公式不适用,所以要单独处理n=1的情况!
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<iostream>
using namespace std;
typedef long long ll;
int main ()
{
ll n;
double ans;
while(~scanf("%lld",&n))
{
ans=1;
if(n!=1&&n!=0)
ans=double( (log10(sqrt(4.0*acos(0.0)*n)) + n*(log10(n)-log10(exp(1.0))))+1);
// ans=floor ((log(sqrt(2*n*pi))+n*log((double)n)-n)/log(10.0))+1;
printf("%lld\n",(ll)ans);
}
return 0;
}
//exp(x) #include<cmath>:求e^x.
想的太多,做的太少。