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.


    想的太多,做的太少。
  • 相关阅读:
    VINS_Fusion 框架
    VINS_Fusion 前端源码解析
    堆与优先队列
    LSD-SLAM简介
    直接法和特征点法的区别与优缺点
    CV::Mat介绍
    C++ 位运算
    OPENCV重要函数
    C++ 优先队列
    特征点法的巅峰之作—ORBSLAM2
  • 原文地址:https://www.cnblogs.com/pealicx/p/6115652.html
Copyright © 2011-2022 走看看