RECORDING MY FANTASY

Tuesday, May 08, 2007

计算n的阶乘n!末尾所含有“0”的个数

声明:来自chinaunix论坛帖子http://www.chinaunix.net/jh/23/926848.html

问题描述

给定参数n(n为正整数),请计算n的阶乘n!末尾所含有0的个数。

例如,5!=120,其末尾所含有的0的个数为1;10!= 3628800,其末尾所含有的0的个数为2;20!= 2432902008176640000,其末尾所含有的0的个数为4。

计算公式

令f(x)表示正整数x末尾所含有的0的个数,则有

当n <>= 5时,f(n!) = k + f(k!), 其中 k = n / 5(取整)。

问题分析

显然,对于阶乘这个大数,我们不可能将其结果计算出来,再统计其末尾所含有的0的个数。所以必须从其数字特征进行分析。下面我们从因式分解的角度切入分析。

我们先考虑一般的情形。对于任意一个正整数,若对其进行因式分解,那么其末尾的0必可以分解为2*5。在这里,每一个0必然和一个因子5相对应。但请注意,一个数的因式分解中因子5不一定对应着一个0,因为还需要一个因子2,才能实现其一一对应。

我们再回到原先的问题。这里先给出一个结论:

结论1: 对于n的阶乘n!,其因式分解中,如果存在一个因子5,那么它必然对应着n!末尾的一个0

下面对这个结论进行证明:

(1)当n 在 0, 5 之间时,f(n!) = 0;

(2)当n >= 5时,令n!= [5k * 5(k-1) * ... * 10 * 5] * a,其中 n = 5k + r (0 <= r <= 4),a是一个不含因子5的整数。

对于序列5k, 5(k-1), ..., 10, 5中每一个数5i(1 <= i <= k),都含有因子5,并且在区间(5(i-1),5i)(1 <= i <= k)内存在偶数,也就是说,a中存在一个因子2与5i相对应。即,这里的k个因子5与n!末尾的k个0一一对应。

我们进一步把n!表示为:n!= 5^k * k! * a(公式1),其中5^k表示5的k次方。很容易利用(1)和迭代法,得出结论1。

上面证明了n的阶乘n!末尾的0与n!的因式分解中的因子5是一一对应的。也就是说,计算n的阶乘n!末尾的0的个数,可以转换为计算其因式分解中5的个数。

令f(x)表示正整数x末尾所含有的0的个数, g(x)表示正整数x的因式分解中因子5的个数,则利用上面的的结论1和公式1有:

f(n!) = g(n!) = g(5^k * k! * a) = k + g(k!) = k + f(k!)

所以,最终的计算公式为:

当n < size="2">当n >= 5时,f(n!) = k + f(k!), 其中 k = n / 5(取整)。

============

这是帖子作者给出的笔记,后面有人回帖提到在柯召,孙琦的《数论讲义》上册的数论函数部分中就有。

Pot_p(n!) = [n/p] + Pot_p([n/p]!)

递归使用这个公式就可以得到 Pot_p(n!) 的表达式。

1 comment:

Anonymous said...

Well written article.