HDU 1018 Big Number

http://acm.hdu.edu.cn/showproblem.php?pid=1018

题目大意

求一个数阶乘的位数

Sample Input

2

10

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;
}
/* bottom:40px 距浏览器底部距离 right:40px 距浏览器右边距离 */