Stirling公式

n!与   

的值十分接近,利用Stirling公式将阶乘转化成幂函数,使得阶乘的结果得以更好的估计。而且n越大,估计得就越准确

用该公式计算n!结果的位数时,可以两边取对数,得:

#include<iostream>
#include<math.h>
using namespace std;
const double e=2.7182818284590452354,pi=3.141592653589793239;   //e和i的值要精确
double str_ling(int n){
    return 0.5*log10(2*pi*n)+n*log10(n/e);
}
int main(){
    int t;
    while (cin>>t)
    {
        cout<<(int)str_ling(t)+1<<endl;
    }
    return 0;
}
时间: 2024-08-06 16:01:13

Stirling公式的相关文章

HDU 1018 -- Big Number (Stirling公式求n!的位数)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1018 Big Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 40551    Accepted Submission(s): 19817 Problem Description In many applications ver

BZOJ 3000(Big Number-Stirling公式求n!近似值)

3000: Big Number Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 220  Solved: 62 [Submit][Status] Description 给你两个整数N和K,要求你输出N!的K进制的位数. Input 有多组输入数据,每组输入数据各一行,每行两个数--N,K Output 每行一个数为输出结果. Sample Input 2 5 2 10 10 10 100 200 Sample Output 1 1 7 69 对

Wallis公式及其应用

今天我要讲的主要内容是什么是Wallis公式,以及它的推导过程.然后讲述Wallis公式的两个重要应用,即推导 Stirling公式和求解Euler-Poisson积分.一次在一个机器学习群里面看到讨论这个公式,借此机会总结一下. Contens 1. 什么是Wallis公式     2. Wallis公式的推导过程     3. 利用Wallis公式推导Stirling公式     4. 利用Wallis公式求解Euler-Poisson积分 1. 什么是Wallis公式    Wallis公

大数的阶乘

首先要确定这个数的阶乘需要开多大的数组,可以用Stirling公式. 输入不超过10000的正整数,计算n!的具体值. #include<iostream> #include<math.h> using namespace std; const int maxn=50000; int main(){ int n,s,k,c; int f[maxn+1]; while (cin>>n) { memset(f,0,sizeof(f)); f[0]=1; for(int i=

poj1423---求一个大数的位数方法,我猜网站上统计输入字符少于多少位的那个算法

法一:对一个数求它的对数,+1取整为其位数 问题转化为int (log10(N!)+1),对数性质log10(N!)=log10(N)+log10(N-1)+...+log10(1) /*用log10求位数*/ #include<stdio.h> #include<math.h> int main() { int tim,N; scanf("%d",&tim); while(tim--) { int i; double NumOfDigit=1; sca

LDA-math-神奇的Gamma函数

http://cos.name/2013/01/lda-math-gamma-function/ 1. 神奇的Gamma函数1.1 Gamma 函数诞生记学高等数学的时候,我们都学习过如下一个长相有点奇特的Gamma函数 Γ(x)=∫∞0tx−1e−tdt 通过分部积分的方法,可以推导出这个函数有如下的递归性质 Γ(x+1)=xΓ(x) 于是很容易证明,Γ(x) 函数可以当成是阶乘在实数集上的延拓,具有如下性质 Γ(n)=(n−1)! 学习了Gamma 函数之后,多年以来我一直有两个疑问: 这个

Big Number

问题陈述: 杭州电子科技大学 HANGZHOU DIANZI UNIVERSITY Online Judge Problem - 1018 问题解析: 公式一: n! = 10^m => lg(10^m) = lg(n!) => m = lg(n) + lg(n-1) + lg(n-2) + ... + lg1; 所以digits = (int)m + 1; 公式二:stirling公式 n! ≍ √2PIn(n/e)n                          化简:lg(n!) =

[51nod1058]求N!的长度

法1:stirling公式近似 $n! \approx \sqrt {2\pi n} {(\frac{n}{e})^n}$ (如果怕n不够大下式不成立,可以当数小于10000时用for求阶层) 也可以用log10函数,不过直接使用log,e没有误差,一定注意longlong: 复杂度$O(1)$ 1 #include<bits/stdc++.h> 2 #define PI acos(-1.0) 3 using namespace std; 4 typedef long long ll; 5 i

大数阶乘的位数和精确值计算【转】

来源:http://www.cnblogs.com/stonehat/p/3603267.html 在此,顶礼膜拜一下原文作者呵呵 我们知道整数n的位数的计算方法为:log10(n)+1 故n!的位数为log10(n!)+1 如果要求出n!的具体值,对很大的n(例如n=1000000)来说,计算会很慢,如果仅仅是求阶乘的位数,可以用斯特林(Stirling)公式求解 斯特林(Stirling)公式: 于是求n!的位数就是求log10((2*PI*n)^1/2*(n/e)^n)+1 即 1/2*l