zoukankan      html  css  js  c++  java
  • ACM 阶乘数位数

    描述

        N!阶乘是一个非常大的数,大家都知道计算公式是N!=N*(N-1)······*2*1.现在你的任务是计算出N!的位数有多少(十进制)?

     
    输入
    首行输入n,表示有多少组测试数据(n<10)
    随后n行每行输入一组测试数据 N( 0 < N < 1000000 )
    输出
    对于每个数N,输出N!的(十进制)位数。
    样例输入
    3
    1
    3
    32000
    样例输出
    1
    1
    130271


     
     
    /*    NYOJ69 阶乘数位长度 
     *    方法一:
     *    可设想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比较大的时候,这种方法方法需要花费很多的时间。
     *    
     *    方法二:
     *    利用斯特林(Stirling)公式的进行求解。下面是推导得到的公式:
     *    res=(long)( (log10(sqrt(4.0*acos(0.0)*n)) + n*(log10(n)-log10(exp(1.0)))) + 1 );
     *    当n=1的时候,上面的公式不适用,所以要单独处理n=1的情况!
     *    有关斯特林(Stirling)公式及其相关推导,这里就不进行详细描述,有兴趣的话可看这里。
     *    这种方法速度很快就可以得到结果。详细证明如下:
     *    http://episte.math.ntu.edu.tw/articles/mm/mm_17_2_05/index.html
    */
    #include<iostream>
    #include <cmath>
    using namespace std;
    int normal(double n)
    {
        double x=0;
        while(n)
        {
            x +=log10(n);
            n--;
        }
        return (int)x+1;
    }
    long stirling(double n)
    {
        long x=0;
        if( n ==1 )
            x = 1;
        else
        {
            x = (long)( (log10(sqrt(4.0*acos(0.0)*n)) + n*(log10(n)-log10(exp(1.0)))) + 1 );
        } 
        return x;
    }
    int main()
    {
        int n;
        cin>>n;
        while(n--)
        {
            int x;
            cin>>x;
            cout<<stirling(x)<<endl;
        }
        return 0;
    }                
  • 相关阅读:
    土木工程材料0732
    07 具有无关项的逻辑函数及其化简
    06 逻辑函数化简法
    AD中板子挖孔开槽
    电容式触摸按键原理
    LTspice
    三相电
    7、简单电阻容元件模型的创建
    cadence17.4在笔记本下设置菜单显示不全的解决办法
    36. 二叉搜索树与双向链表
  • 原文地址:https://www.cnblogs.com/sdlwlxf/p/4440942.html
Copyright © 2011-2022 走看看