zoukankan      html  css  js  c++  java
  • HDOJ1018 ( Big Number ) 【斯特林公式处理阶乘及阶乘位数的问题】

    1:把n!写成10^m次方的形式,如果m=2,就说明是三位数。

    【维基百科】

    【别处摘来的】可以将n!表示成10的次幂,即n!=10^M(10的M次方,10^2是3位M+1就代表位数)则不小于M的最小整数就是
        n!的位数,对该式两边取对数,有M=log10^n!即:
        M = log10^1+log10^2+log10^3...+log10^n
        循环求和,就能算得M值

    ,该M是n!的精确位数。

    Problem : 1018 ( Big Number )     Judge Status : Accepted
    RunId : 6013028    Language : C    Author : qq1203456195
    Code Render Status : Rendered By HDOJ C Code Render Version 0.01 Beta
     1 #include <stdio.h>
     2 #include <math.h>
     3 int main()
     4 {
     5     int n,cas,i;
     6     double sum;
     7     scanf("%d",&cas);
     8     while (cas--)
     9     {
    10         scanf("%d",&n);
    11         sum=1;
    12         for(i=1;i<=n;i++)    sum+=log10((double)i);
    13         printf("%d\n",(int)sum);
    14     }
    15     return 0;
    16 }

    2:斯特林公式的应用【没用这个,代码是别人的】

    由斯特林[striling]公式可得:lnN!=NlnN-N+0.5ln(2N*pi)

    而N的阶乘的位数等于:log10(N!)取整后加1

    log10(N!)=lnN!/ln(10) 所以len=lnN!/ln(10)+1

     1 #include<iostream>
     2 #include<cmath>
     3 const double PI=3.14159265;
     4 using namespace std;
     5 int main()
     6 {
     7     int t,n;
     8     double sum;
     9     cin>>t;
    10     while(t--)
    11     {   
    12         cin>>n;
    13         sum=(n*log(n) - n + 0.5*log(2*n*PI))/log(10)+1;
    14         printf("%d/n",(int)sum);   
    15     }
    16     return 0;
    17 }
    字节跳动内推

    找我内推: 字节跳动各种岗位
    作者: ZH奶酪(张贺)
    邮箱: cheesezh@qq.com
    出处: http://www.cnblogs.com/CheeseZH/
    * 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    ubuntu android jdk问题
    android adb ubuntu问题
    常用命令
    svn info
    TaskRecord分析
    moveTasktoBack 把当前任务放入后台
    WatchDog机制
    双系统安装
    制作安装U盘
    android 小游戏 ---- 数独(二)
  • 原文地址:https://www.cnblogs.com/CheeseZH/p/2522786.html
Copyright © 2011-2022 走看看