我正在尝试在python中执行卡普雷卡常数,但我得到了下面的结果。

2024-10-03 23:19:46 发布

您现在位置: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,,,''''''''   "

Tags: trueinputlencountnumintreversesorted
1条回答
网友
1楼 · 发布于 2024-10-03 23:19:46

出现错误的原因是使用变量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)))

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

在这一点上,我们需要小心,不要简单地认为这一变化没有任何影响。有;只是看起来不像有。我们可以通过print增加count变量的值来证明它有效果:以前,它只打印1,现在它打印12。现在我们进入while循环的第二次迭代;在第一次迭代失败之前。你知道吗

但为什么我们还是会犯同样的错误呢?你知道吗

while循环的开始,我们调用num = list(str(num))。假设num是一个int,这将num转换为一个数字列表。但是,在while循环的末尾,num不会转换回int。它仍然是一个数字列表。下一次通过while循环,我们再次调用列表上的str。但是为什么num没有在while循环的末尾转换回int?因为desasc之间的差异被分配给了result,但是没有对result中的值做任何处理。您执行了一个计算,然后忽略了计算结果。你知道吗

我猜那不是写作

        result = int(des) - int(asc)

你本想写的

        num = int(des) - int(asc)

进行此更改将修复您的代码,并且它看起来像您期望的那样工作。输入8786并打印3。你知道吗

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

相关问题 更多 >