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,,,'''''''' "
答案 0 :(得分:1)
您收到错误是因为您使用变量num
来表示两件事:数字或包含组成数字的数字的1元素字符串列表,并且正在使用很难跟踪这两件事num
中的哪一件事贯穿整个计划。
外部while
循环的正文首先将num
作为数字转换为num
作为数字字符串列表,然后通过插入零使数字最多为四位数前面的数字。到现在为止还挺好。然后,您可以使用以下代码计算des
和asc
des = int(''.join(sorted(str(num), reverse=True)))
asc = int(''.join(sorted(str(num))))
似乎你已经忘记了num
现在是一个字符串列表。当您在str
上致电num
时,您正在列出str
列表中的['8', '7', '8', '6']
,因此您最终会收到字符串"['8', '7', '8', '6']"
。以相反的顺序对该字符串的字符进行排序会为您提供字符串"][8876,,,'''''''' "
,当然不能将其转换为数字,因此会出现错误。
所以,让我们从str
和des
的计算中删除对asc
的调用:
des = int(''.join(sorted(num, reverse=True)))
asc = int(''.join(sorted(num)))
现在运行程序会发生什么?我们得到了同样的错误!
此时我们需要注意不要简单地将此更改视为没有效果。它有;它只是看起来不像它。我们可以通过print
增加count
变量的值来证明它已经产生影响:之前,它只打印1
,现在它打印1
并且2
。现在我们进入while
循环的第二次迭代;在我们第一次失败之前。
但为什么我们仍然会得到同样的错误?
在while
循环开始时,我们调用num = list(str(num))
。假设num
是int
,则会将num
转换为数字列表。但是,在while
循环结束时,num
未转换回int
。它仍然是一个数字列表。下次通过while
循环时,我们最终会再次在列表中调用str
。但是为什么在num
循环结束时int
没有转换回while
?由于des
和asc
之间的差异已分配给result
,,但 result
中的值未执行任何操作。您已执行计算,然后忽略了它的结果。
我猜这不是写
result = int(des) - int(asc)
你打算写
num = int(des) - int(asc)
进行此更改可修复您的代码,它似乎可以按预期工作。输入8786
,然后打印3
。
我建议您返回代码并引入第二个变量,例如numDigits
或digitsOfNum
,并在工作时使用此变量代替num
带有一个数字列表。这样你的代码应该更容易理解。您可能还想考虑如果有人输入的数字长于四位数(例如123456
),或者包含重复四次的相同数字,例如5555
。