背景介绍
今天遇到这样一个额需求:用阶乘函数求强数的 Python 程序。所谓强数,就是一个特殊数字,满足其所有数字阶乘的和应等于数字本身的条件。
问题描述
def facorial_of_number(number):result = 1for i in range(1, number + 1):result *= ireturn resultdef is_strong_number(number):sum = 0while number > 0:rem = number % 10sum += facorial_of_number(rem)number //= 10if sum == number :return Trueelse:return Falsenum = int(input("enter a number : "))if is_strong_number(num):print("{0} is strong number".format(num))
else:print("{0} is not strong number".format(num))
因为事先知道145是一个强数,但在这里边却硬是把145判定为不是强数,这就很诡异!
开启debug模式,facorial_of_number(number)运行正常,
并且is_strong_number(number)中求得的阶乘之和sum也是正确的(145),
按理说sum=145,输入的number=145,正好sum = number,
但是为什么debug的下一步会直接跳到else里?
原因分析
哦!明白了!心机蛙一直在摸你肚子!注意看第二张debug图:啥时候number已经偷摸摸的变为0了,而不是输入的那个number = 145,所以显然就出错了嘛!
number作为参数传入is_strong_number()中,在函数内就作为局部变量可以操作,每一次的整除10都会使number值发生变化,这样一来,操作的就不再是原始的number值了。
问题解决
其实这个也好解决,无非就是找一个容器把原始的number保存下来,最后再拿来用就好了,笔者在这里就是用这样的方法:
def is_strong_number(num):sum = 0number = numwhile number > 0:rem = number % 10sum += facorial_of_number(rem)number //= 10if sum == num :return Trueelse:return False
再次运行,解决!
完结撒花
之前遇到莫名奇怪的问题的时候总觉得是程序的错,但是程序是人写的,即使是程序的错也是人的原因,冷静下来分析问题是一种非常难得的态度,希望与大家共勉。
另附
bug 只要管他,他就会自己修复。
希望大家的程序都能如这句话。