每个人的Python:数学、算法和游戏编程训练营
上QQ阅读APP看书,第一时间看更新

4.2.3 代码改进——求阶乘的尾数

前面成功挑战了与加法相关的编程题,我们现在要尝试挑战更高级的乘法了。对于阶乘,相信大家并不陌生,在数学中,阶乘使用!表示,即3!表示3的阶乘,可以展开为1*2*3。现在,输入一个数,尝试编程计算出其阶乘的结果中,末尾有几个0。例如,当输入5的时候,结果为1,因为5! = 120,末尾有一个0。

大部分读者看到本题,可能会想到使用最直接的方式来解答,即首先计算出输入数的阶乘,之后将数值转换成列表来检查列表尾部有多少个字符“0”。这种思路是正确的,但是并不可行。计算阶乘本身是一个十分耗时的操作,尤其是当输入的数字非常大时,计算阶乘就仅仅是理论上可行了。那么,我们就需要思考一下,是否可以从数字本身的性质入手解决这道题。

首先,这道题所要计算的是阶乘的结果末尾有多少个0,对于乘法运算,其末尾如果要出现0,其因子中一定包含5,例如2*5=10、4*5=20、6*5=30、8*5=40等。因此,要得到阶乘的结果末尾有多少个0,我们只需要计算出原数可以拆解出多少个因子5即可,找到了这个规律,解决本题将变得非常简单。示例代码如下:

在编程时,很多时候笨方法是解题的最直接思路,但更多时候,我们要通过巧妙的算法来增加解题的效率。计算机计算得很快、也很准确,但它并不是万能的,巧妙的算法还是需要编程人员对数学原理有一定的理解和对编程算法不懈的探索。