zoukankan      html  css  js  c++  java
  • 计算n!的位数<Math>

    题意:如题目.

    方法一:<TLE>
     *    可设想n!的结果是不大于10的M次幂的数,即n!<=10^M(10的M次方),则不小于M的最小整数就是 n!的位数,对
     *    该式两边取对数,有 M =log10^n! 即:M = log10^1+log10^2+log10^3...+log10^n 循环求和,就能算得M值,
     *    该M是n!的精确位数。当n比较大的时候,这种方法方法需要花费很多的时间。
     *
    #include<iostream>
    #include<cstdio>
    #include<cmath>
    using namespace std;
    int main ()
    {
        int n;
        double sum;
        while(scanf("%d",&n)!=EOF)
        {
            sum=1;
            for(int i=2;i<=n;i++)
                sum+=log10(i);
            printf("%d
    ",(int)sum);
        }
        return 0;
    }

    *    方法二:
     *    利用斯特林(Stirling)公式的进行求解。下面是推导得到的公式:
     *    res=(long)( (log10(sqrt(4.0*acos(0.0)*n)) + n*(log10(n)-log10(exp(1.0)))) + 1 );
     *    当n=1的时候,上面的公式不适用,所以要单独处理n=1的情况!

    #include<cstdio>

    #include<cstdlib>

    #include<cstring>

    #include<string>

    #include<algorithm>

    #include<cmath>

    #include<vector>

    #include<stack>

    #include<map>

    #include<queue>

    #include<iostream>

    using namespace std;

    typedef long long ll;

    int main ()

    {

        ll n;

        double ans;

        while(~scanf("%lld",&n))

        {

            ans=1;

            if(n!=1&&n!=0)

                ans=double( (log10(sqrt(4.0*acos(0.0)*n)) + n*(log10(n)-log10(exp(1.0))))+1);

             // ans=floor ((log(sqrt(2*n*pi))+n*log((double)n)-n)/log(10.0))+1;

            printf("%lld ",(ll)ans);

        }

        return 0;

    }

    //exp(x) #include<cmath>:求e^x.


    想的太多,做的太少。
  • 相关阅读:
    ie 火狐兼容集锦
    ie css png
    jQuery插件——autoTextarea-文本框根据输入内容自适应高度
    比onload更快获取图片尺寸(转载)
    数据库性能问题排查
    项目管理_FindBugs的使用
    js动态获取子复选项并设计全选及提交
    SVN使用_获取某版本后改动的文件列表
    存储过程_把字符串转化为结果集
    Spring下如何配置bean
  • 原文地址:https://www.cnblogs.com/pealicx/p/6115652.html
Copyright © 2011-2022 走看看