http://acm.hdu.edu.cn/showproblem.php?pid=1018
题目大意
求一个数阶乘的位数
Sample Input
2
20
Sample Output
7
9
方法与总结
- 用对数求位数(
log10(n*m)=log10(n)+log10(m)
) - 用斯特林公式(
lnN!=NlnN-N+0.5*ln(2*N*pi)
)
代码
对数求位数
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n,m;
double sum;
while(cin>>n)
{
while(n--)
{
cin>>m;
sum=0;
for(int i=1;i<=m;i++)
sum+=log10(i);
cout<<(int)sum+1<<endl;
}
}
return 0;
}
斯特林公式
#include<iostream>
#include<cmath>
using namespace std;
const double PI=3.14159265;
void solve(int num)
{
double s=(num*log(num)-num+0.5*log(2*num*PI))/(log(10));
cout<<(int)s+1<<endl;
}
int main()
{
int n,m;
cin>>n;
while(n--)
{
cin>>m;
solve(m);
}
return 0;
}