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;
}
      
    