丢番图方程实现

时间:2012-06-22 22:13:38

标签: python

我被要求做以下事情: 如果可以购买x,x + 1,......,x + 5套McNuggets,对于某些x,则可以购买任意数量的McNuggets> = x,因为McNuggets分别为6,9和20包。编写一个迭代程序,找出无法以精确数量购买的最大数量的McNuggets。

这是我提出的代码,但它陷入无限循环:

count = 0
n = 1
while count < 6:
    six_consequtive = True
    for a in range(n):
        for b in range(n):
            for c in range(n):
                if 6*a + 9*b + 20*c == n:
                    six_consequtive = False
    if six_consequtive:
        count += 1
    else:
        count = 0

    n += 1

print("Largest number of McNuggets that cannot be bought in exact quantity: %d." % (n - 5))

非常感谢!

2 个答案:

答案 0 :(得分:0)

似乎很清楚问题是什么:只有在可以获得确切数量时才会增加count。每当你不增加count时,你将它重置为0,并且当循环超过6时循环才会停止。这可能需要一段时间。

你编写了一个三重嵌套的for循环,因此得到的n越大,这些循环越慢。如果你让它运行得足够长,它可能会成功并在某一天结束;但是你的基本算法太慢了。

您可以通过使用print语句设置循环来了解更多信息。当我尝试它时,我没有得到输出;我想这可能是由于缓冲问题,所以我写了一个简单的输出函数,输出一个字符串,然后刷新,以确保我可以立即看到输出。

以下是您编辑的程序:

import sys

def out(s):
    sys.stdout.write(s + "\n")
    sys.stdout.flush()

count = 0
n = 1
while count < 6:

    six_consecutive = True
    for a in range(n):
        for b in range(n):
            for c in range(n):
                #out("a: %d b: %d c: %d  n: %d" % (a, b, c, n))
                if 6*a + 9*b + 20*c == n:
                    six_consecutive = False

    out("n == %d  count == %d  six_consecutive == %s" %
            (n, count, str(six_consecutive)))

    if six_consecutive:
        count += 1
    else:
        count = 0

    n += 1

print("Largest number of McNuggets that cannot be bought in exact quantity: %d." % (n - 5))

我还修改了“six_consecutive”的拼写。

那么,你应该怎么解决这个问题呢?我认为你应该扔掉它并用更好的算法重写。您可能想检查并查看其他人如何解决此问题或类似问题。当我给出一组不同面额的硬币时,这让我觉得非常类似于如何改变的经典问题。

注意:做出改变的经典问题通常是假定一组合理的硬币,包括一个价值为1的硬币。一个简单的“贪婪”算法,从最大的硬币开始算起来,总是会成功。这更有趣,因为“硬币”设置很奇怪,并且有些值无法找到,所以也许经典的硬币问题并不像我想的那么重要。

答案 1 :(得分:0)

对不起,我刚才意识到我的布尔值已经反转了。循环开头的第一个6_consequtive应分配为False,第二个为True。 再一次,我对这个愚蠢的问题感到非常抱歉。