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/
* 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原文地址:https://www.cnblogs.com/CheeseZH/p/2522786.html