我正在尝试在python中执行Kaprekars Constant,但是我收到以下错误


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数字字符串列表,然后通过在前面插入零位数字使数字最多四位。 目前为止,一切都好。 然后使用以下代码计算desasc

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,,,'''''''' ",当然不能转换为数字,因此会出现错误。

因此,让我们从desasc的计算中删除对str的调用:

des = int(''.join(sorted(num, reverse=True)))
asc = int(''.join(sorted(num)))

当我们现在运行您的程序时会发生什么? 我们得到同样的错误!

在这一点上,我们需要小心,不要简单地将此更改视为没有效果。 它有;它只是看起来不像。 我们可以通过在递增count变量的值后print来证明它产生了效果:以前,它只打印1,现在它打印12。 现在我们正在进入while循环的第二次迭代;在我们第一次失败之前。

但是为什么我们仍然得到同样的错误?

while循环开始时,我们称之为num = list(str(num)). 假设num是一个int,这会将num转换为数字列表。 但是,在while循环结束时,num不会转换回int。 它仍然是一个数字列表。 下次通过while循环时,我们最终会再次在列表中调用str。 但是,为什么numwhile循环结束时没有转换回int呢? 因为desasc之间的差值被分配给result,但对result中的值没有做任何事情。 您已经执行了计算,然后忽略了计算的结果。

我猜不是写

result = int(des) - int(asc)

你的意思是写

num = int(des) - int(asc)

进行此更改可修复您的代码,并且它似乎按预期工作。 输入8786,它将打印3

我建议您返回代码并引入第二个变量,例如名为numDigitsdigitsOfNum,并在处理数字列表时使用它而不是num。 这样,您的代码应该更容易理解。 您可能还想考虑如果有人输入超过四位数字的数字会发生什么(例如123456(,或包含重复四次的相同数字,例如5555.

最新更新