我试图在python中执行Kaprekars常量,但我得到以下错误

时间:2018-06-14 19:03:17

标签: python

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,,,''''''''   "

1 个答案:

答案 0 :(得分:1)

您收到错误是因为您使用变量num来表示两件事:数字或包含组成数字的数字的1元素字符串列表,并且正在使用很难跟踪这两件事num中的哪一件事贯穿整个计划。

外部while循环的正文首先将num作为数字转换为num作为数字字符串列表,然后通过插入零使数字最多为四位数前面的数字。到现在为止还挺好。然后,您可以使用以下代码计算desasc

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

所以,让我们从strdes的计算中删除对asc的调用:

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

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

此时我们需要注意不要简单地将此更改视为没有效果。它有;它只是看起来不像它。我们可以通过print增加count变量的值来证明它已经产生影响:之前,它只打印1,现在它打印1并且2。现在我们进入while循环的第二次迭代;在我们第一次失败之前。

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

while循环开始时,我们调用num = list(str(num))。假设numint,则会将num转换为数字列表。但是,在while循环结束时,num未转换回int。它仍然是一个数字列表。下次通过while循环时,我们最终会再次在列表中调用str。但是为什么在num循环结束时int没有转换回while?由于desasc之间的差异已分配给result,但 result中的值未执行任何操作。您已执行计算,然后忽略了它的结果。

我猜这不是写

        result = int(des) - int(asc)

你打算写

        num = int(des) - int(asc)

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

我建议您返回代码并引入第二个变量,例如numDigitsdigitsOfNum,并在工作时使用此变量代替num带有一个数字列表。这样你的代码应该更容易理解。您可能还想考虑如果有人输入的数字长于四位数(例如123456),或者包含重复四次的相同数字,例如5555