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

4.2.1 编程实现——一个数的各位相加

Python语言自带数学运算相关的函数,对于四则运算,Python中也提供了相应的运算符可以直接使用。

现在,尝试编程解决这样一个问题:输入一个非负整数,将这个数字的每一位上的数字提取出来并进行累加,将累加结果返回。

例如,输入数字21,则返回的结果为2+1=3;输入数字123,则返回的结果为1+2+3=6。

对我们来说,只按照题目中的要求来解决这道题非常容易,借助列表和字符串可以将数值中的每一位数字提取出来,之后进行简单的相加即可。示例代码如下:

如果仅仅如此,本道题的价值就太小了,实际上,本道题还可以进行拓展,当将数值的各位相加后,如果得到的结果不是个位数,就继续之前的操作,将结果的每一位数也进行相加,直到最终得到个位数的结果。题目只做了一点简单的修改,对于程序来说,就需要我们增加更复杂的逻辑。

分析上面的题目,最终需要得到个位数的结果,因此使用循环来解决问题思路比较清晰简单。示例代码如下:

现在,我们尝试挑战一下自己,假设不使用循环和递归,你能否解决这个问题呢?

乍看起来,这个要求有点过分,但是仔细分析一下各位相加这个操作的特点,有一个巧妙的方法可以帮助在不使用循环的前提下快速解决这个问题。首先,对于任意数值,我们可以将其写成如下格式:

abc = 100*a+10*b+c

最终,我们需要计算的实际上是a + b + c的值,因此可以将上面的等式改写如下:

abc = 99a+9b+(a+b+c)

因此,对于任意数来说,我们要求最终a+b+c的值,直接将原数对9进行取余即可。但是需要注意,有一种情况需要特殊处理,除了0之外,任何数对9取余如果结果为0,则表明其各位相加的结果为9。使用以上思路改写代码如下:

本来看似不可能完成的任务经过我们深入思考后,解决方案竟然这么简单。这就是编程的魔力,也是算法的魅力所在。永不满足,永远追求更优解,我们学习编程的最终目的也是如此。