今天遇到这样一个问题:寻找1-10000内的 Spyder 数,Spyder 数是指,如果将一个数的每个位上的数字相乘,再将这些乘积相加,最终得到的和等于原始数,那么该数就是 Spyder 数。
逻辑分析
这个逻辑其实很简单,就是用代码把上面的功能实现就好了:
def is_Spyder_Number(number) :
sum = 0
pro = 1
while number > 0 :
rem = number % 10
sum += rem
pro *= rem
number //= 10
if sum == pro :
return True
else:
return False
然后就是创建1-10000的输入环境:
min = int(input("enter the min number : "))
max = int(input("enter the max number : "))
print("Spyder Number between min and max : ")
for i in range(min , max + 1):
# sum,pro = sum_and_pro(i)
# if sum == pro:
if is_Spyder_Number(i):
print(i, end=" ")
ok,解决!
遇到问题
但是,我是谁啊?我是小白啊!我得多寻求一种实现方法啊!正好,前几天学的global拿来用用:
sum = 0
pro = 1
def sum_and_pro(number):
global sum,pro
if number > 0:
rem = number % 10
sum += rem
pro *= rem
number //= 10
sum_and_pro(number)
return sum,pro
else:
return 0
def is_Spyder_Number(number):
sum,pro = sum_and_pro(number)
if sum == pro:
return True
else:
return False
整个写代码的过程可谓是一气呵成,不打哈欠!
但是调试的时候却出错了!
这结果明显不对啊!!!那到底怎么回事呢?先debug!
ok,1没有问题,那我们再来看看2:
什么情况?2为什么得到的sum=3?不应该是2吗?先问chatgpt,看看他怎么说:
在您的代码中,出现了一个全局变量
sum
,但是sum
是 Python 内置函数的一个名字,它用于计算可迭代对象的元素和。当您命名一个全局变量为sum
,会导致与内置函数发生命名冲突,从而可能导致不可预测的结果。这就是为什么在
sum_and_pro
函数中,当您尝试将rem
加到sum
上时,实际上会调用内置的sum
函数,而不是您预期的全局变量。这就是为什么您会看到sum
的值出现不可预测的变化。
哦?也就是说我用的这个和其他可能冲突了?所以计算过程中搬来了别人的?那我重启好了!
ok,我确实重启了,但是bug却没有自己跑掉,这是什么原因呢?
原因分析
global,globa,global!!!
哦!我明白了,我在定义这个global的时候,他是全局存在的一个变量,也就是对sum的操作都会落在全局的这个值上,也就是各个步骤的累加或者累乘,那这么依赖,在很短的时间内pro过万也就得到了解释。
所以,在求范围内的某种数(幸福数,间谍数,霓虹灯数等)的时候要禁止使用global,因为范围内的查找必然涉及到多轮,那这么一来就不可避免的累计计算。
完结撒花
一晚上搞定一道题,还真是有点费时间,不过通过这件事情认识到自己学习方面存在的问题还是挺值得的。