码迷,mamicode.com
首页 > 其他好文 > 详细

HDOJ(1018)

时间:2015-07-30 20:44:46      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:

数学公式推导

方法一:

①:10^M < n!   <10^(M+1)  若求得M,则M+1即为答案。

对公式①两边以10为底取对数

M < log10(n!) < M+1

因为 log10(n!)=log10(1)+log10(2)+……+log10(n)

可用循环求得M+1的值

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int n;
        cin>>n;
        double ans=0;
        for(int i=1;i<=n;i++)
        {
            ans+=log(i)/log(10);
        }
        cout<<(int)ans+1<<endl;
        
    }
    return 0;
}

方法二:斯特林公式
n! ≈ sqrt(2*n*pi)*(n/e)^n

则 M+1=(int)(0.5*log(2.0*n*PI)+n*log(n)-n)/(log(10.0)) )+1;

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const double PI=3.1415926;
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int n;
        cin>>n;
        double ans;
        ans=(0.5*log(2.0*n*PI)+n*log(n)-n)/(log(10.0));
        cout<<(long)ans+1<<endl; 
    }
    return 0;
}

 

HDOJ(1018)

标签:

原文地址:http://www.cnblogs.com/program-ccc/p/4690303.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!