关于如何确定阶乘结果的位数呢,
就是位数x可用由 10^(x-1)≤n!≤10^x,再取对数获得。
最开始做的时候想法很简单,就是用个循环,因为log(n!)=log1+log2+。。。。。。+logn,所以加起来就好了。结果一提交,就是 time limit exceeded。于是就上网上去查找计算阶乘的其他方法,就找到了斯特灵公式。之后就是在纸上演算怎么样才能把这个式子表示出来了。
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
//N表示用户想输入几次,i为计数器
int N,i;
cin>>N;
double in;
double out;
for(i=0;i<N;i++)
{
cin>>in;
//斯特灵公式不适应1的情况,因此单独考虑
if(in==1)
cout<<1<<endl;
else
{
//这就是斯特灵公式,“n!≈sqrt(2πn)(n/e)^n”
//而求阶乘结果的位数x可用由 10^(x-1)≤n!≤10^x,再取对数获得。
//因此利用log的性质写出了下面的式子
//acos为反余弦,2*acos(0.0)为π
//exp(1.0)是为了得到e,这个式子就是e^1
out=(log10(sqrt(4*acos(0.0)*in))+in*(log10(in)-log10(exp(1.0))))+1;
cout<<(int)out<<endl;
}
}
return 0;
}
最开始做的时候想法很简单,就是用个循环,因为log(n!)=log1+log2+。。。。。。+logn,所以加起来就好了。结果一提交,就是 time limit exceeded。于是就上网上去查找计算阶乘的其他方法,就找到了斯特灵公式。之后就是在纸上演算怎么样才能把这个式子表示出来了。
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
//N表示用户想输入几次,i为计数器
int N,i;
cin>>N;
double in;
double out;
for(i=0;i<N;i++)
{
cin>>in;
//斯特灵公式不适应1的情况,因此单独考虑
if(in==1)
cout<<1<<endl;
else
{
//这就是斯特灵公式,“n!≈sqrt(2πn)(n/e)^n”
//而求阶乘结果的位数x可用由 10^(x-1)≤n!≤10^x,再取对数获得。
//因此利用log的性质写出了下面的式子
//acos为反余弦,2*acos(0.0)为π
//exp(1.0)是为了得到e,这个式子就是e^1
out=(log10(sqrt(4*acos(0.0)*in))+in*(log10(in)-log10(exp(1.0))))+1;
cout<<(int)out<<endl;
}
}
return 0;
}
转载于:https://blog.51cto.com/wingstudy/323851