虽然声明没有停止它应该

时间:2012-04-11 15:56:10

标签: python while-loop

这是我在这里的第一篇文章。我是Python和编程的新手,所以我不确定我哪里出错了。这是我在项目Euler问题#52中提出的解决方案(我知道它可能不是最好的方法)。我对这段代码的问题是,当得到正确的答案时,while语句不会中断。只有当我用正确的答案开始num时才会抓住它并给我答案:142857,但是当我用其他任何东西初始化它时它会继续计数到142857之外。奇怪的是我用同样的方法来回答另一个欧拉问题和那个工作得很好。谁能告诉我为什么会发生这种情况?谢谢!

def digits(number):
    return [int(x) for x in str(number)]

def same_digits():
    num = 1
    x2 = sorted(digits(num*2))
    x3 = sorted(digits(num*3))
    x4 = sorted(digits(num*4))
    x5 = sorted(digits(num*5))
    x6 = sorted(digits(num*6))

    while x2 != x3 != x4 != x5 != x6:
        num += 1
    print num

3 个答案:

答案 0 :(得分:4)

变量x2等在循环内部不会更改,因此它们将始终保持其初始值。如果您希望在num更改时重新计算其值,则需要将该代码移动到循环中。

此外,您在此处使用比较运算符链接。表达式

x2 != x3 != x4 != x5 != x6

相当于

x2 != x3 and x3 != x4 and x4 != x5 and x5 != x6

这可能不是你想要的。

答案 1 :(得分:2)

while循环永远不会中断,因为x2,x3,x4,x5,x6都处于相同的值。循环中只有num个变化。

此外,x2 != x3 != x4 != x5 != x6看起来很可疑。要检查所有数字是否不同,请尝试:

len(set([x2,x3,x4,x5,x6])) != 5

set仅获取唯一值,len计算此“set”的大小。更好的是把它们放在一个列表中,比如R,这就变成了:

len(set(R)) != 5

当您的列表中包含超过5个元素时非常方便!

答案 2 :(得分:1)

您没有修改while循环中的任何xi参数,因此比较永远不会改变。