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
des = int(''.join(sorted(str(num), reverse=True)))
asc = int(''.join(sorted(str(num))))
您似乎忘记了num
现在是字符串列表。 当你在num
上调用str
时,你是在['8', '7', '8', '6']
上调用列表上的str
,因此你最终得到字符串"['8', '7', '8', '6']"
。 以相反的顺序对该字符串的字符进行排序会得到字符串"][8876,,,'''''''' "
,当然不能转换为数字,因此会出现错误。
因此,让我们从des
和asc
的计算中删除对str
的调用:
des = int(''.join(sorted(num, reverse=True)))
asc = int(''.join(sorted(num)))
当我们现在运行您的程序时会发生什么? 我们得到同样的错误!
在这一点上,我们需要小心,不要简单地将此更改视为没有效果。 它有;它只是看起来不像。 我们可以通过在递增count
变量的值后print
来证明它产生了效果:以前,它只打印1
,现在它打印1
和2
。 现在我们正在进入while
循环的第二次迭代;在我们第一次失败之前。
但是为什么我们仍然得到同样的错误?
在while
循环开始时,我们称之为num = list(str(num))
. 假设num
是一个int
,这会将num
转换为数字列表。 但是,在while
循环结束时,num
不会转换回int
。 它仍然是一个数字列表。 下次通过while
循环时,我们最终会再次在列表中调用str
。 但是,为什么num
在while
循环结束时没有转换回int
呢? 因为des
和asc
之间的差值被分配给result
,但对result
中的值没有做任何事情。 您已经执行了计算,然后忽略了计算的结果。
我猜不是写
result = int(des) - int(asc)
你的意思是写
num = int(des) - int(asc)
进行此更改可修复您的代码,并且它似乎按预期工作。 输入8786
,它将打印3
。
我建议您返回代码并引入第二个变量,例如名为numDigits
或digitsOfNum
,并在处理数字列表时使用它而不是num
。 这样,您的代码应该更容易理解。 您可能还想考虑如果有人输入超过四位数字的数字会发生什么(例如123456
(,或包含重复四次的相同数字,例如5555
.