def difficultNumber(num):
count=0
while num !=6174:
num = list(str(num))
if len(num) < 4:
while len(num) != 4:
num.insert(1,'0')
count +=1
des = int(''.join(sorted(str(num), reverse=True)))
asc = int(''.join(sorted(str(num))))
result = int(des) - int(asc)
return count
print(difficultNumber(input()))
=================================
8786
Traceback (most recent call last):
File "cb_ex9.py", line 19, in <module>
print(difficultNumber(input()))
File "cb_ex9.py", line 12, in difficultNumber
des = int(''.join(sorted(str(num), reverse=True)))
ValueError: invalid literal for int() with base 10: "][8876,,,'''''''' "
出现错误的原因是使用变量
num
表示两件事:要么是数字,要么是包含构成数字的数字的1元素字符串列表,并且很难跟踪这两件事中的哪一件num
一直贯穿程序。你知道吗外部
while
循环的主体首先将num
作为数字转换为num
作为数字字符串列表,然后通过在前面插入零位将数字转换为四位数字。到现在为止,一直都还不错。然后使用以下代码计算des
和asc
似乎您忘记了
num
现在是一个字符串列表。当您在num
上调用str
时,您调用的是列表['8', '7', '8', '6']
上的str
,因此您得到的是字符串"['8', '7', '8', '6']"
。将该字符串中的字符按相反顺序排序会得到字符串"][8876,,,'''''''' "
,当然不能将其转换为数字,因此会出现错误。你知道吗那么,让我们从
des
和asc
的计算中删除对str
的调用:当我们现在运行你的程序时会发生什么?我们得到同样的错误!你知道吗
在这一点上,我们需要小心,不要简单地认为这一变化没有任何影响。有;只是看起来不像有。我们可以通过
print
增加count
变量的值来证明它有效果:以前,它只打印1
,现在它打印1
和2
。现在我们进入while
循环的第二次迭代;在第一次迭代失败之前。你知道吗但为什么我们还是会犯同样的错误呢?你知道吗
在
while
循环的开始,我们调用num = list(str(num))
。假设num
是一个int
,这将num
转换为一个数字列表。但是,在while
循环的末尾,num
不会转换回int
。它仍然是一个数字列表。下一次通过while
循环,我们再次调用列表上的str
。但是为什么num
没有在while
循环的末尾转换回int
?因为des
和asc
之间的差异被分配给了result
,,但是没有对result
中的值做任何处理。您执行了一个计算,然后忽略了计算结果。你知道吗我猜那不是写作
你本想写的
进行此更改将修复您的代码,并且它看起来像您期望的那样工作。输入
8786
并打印3
。你知道吗我建议您返回代码并引入第二个变量,例如
numDigits
或digitsOfNum
,在处理数字列表时使用此变量而不是num
。这样你的代码应该更容易理解。您可能还想知道,如果有人输入的数字超过四位数(例如123456
),或者包含重复四次的相同数字(例如5555
),会发生什么情况。你知道吗相关问题 更多 >
编程相关推荐