数学学习之阶乘

来源:互联网 发布:遗传算法应用领域 编辑:程序博客网 时间:2024/04/29 06:48

今天看了一会《离散数学及其应用》的第一章后面的上机题的第一道题。

求n!的位数在100到100之间的最大的n。

      要解决这个问题,首先就来研究一下阶乘的性质。

      查一下wiki百科,就会发现关于阶乘有个斯特林公式:n!\sim\sqrt{2\pi n}\;\left(\frac{n}{e}\right)^{n}    (有兴趣戳这里),那么我们就可以很快的求出n的阶乘。但是我们不需要求出n的阶乘,只需要知道它有多少位。所以现在就要知道怎样求一个数有多少位了。答案就是log(n)+1。下面是简单证明:

      设一个数为n,它有w位,则它可表示为n=c+10^(w-1),其中c<10。所以w=log(n)+1。

      所以有斯特林公式,就可以很快的求出n的阶乘有多少位了。不过当n不大的时候,可以有log(10)=log(1)+······+log(n)得到。可以看一下(Poj 1423 big bumber )就是求一个数有多少位。

      因此,解决上面的问题求n!的位数在100到100之间的最大的n,就只需要简单的枚举下就可以了。

    既然在看阶乘,就一下把相关的题目做一做吧。

     求n!后面有多少个零。poj 1401 facrorial

     将n!展开:n!=1*2*3*4*5······*n。要想知道末尾有多少零,只需知道有多少个2和5相乘就可以了。又因为在n!中5比2少很多,只需要知道有多少个5既可以了,即在n!中,因子5出现了多少次。关于这个问题,《具体数学》中有所提及。

     给定一个素数p,在{1,2,3,···n}中,它的倍数有ceil(n/p)个。

            则p的平方, 在{1,2,3,···n}中,它的倍数有ceil(n/p^2)个。

    依次类推,就知道在{1,2,3,···n}中,素数p一共出现了多少次。