2012-06-22 28 views
1

我被要求做以下几点: 如果有可能购买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)) 

非常感谢您!

+0

你能否解释“六连冠”测试的目的?你的家庭作业是否指出,一旦你发现连续一些财产的六个值,你可以认为你有答案?如果是这样,你能描述一下这个属性吗? – steveha

+0

是的,正如我在问题中所说的那样,如果有可能购买x,x + 1,...,x + 5套McNuggets,对于某些x,则有可能购买任意数量的McNuggets> = x,因为McNuggets有6,9和20包。这是因为如果你找到6个连续集合,你总是可以无限增加6个集合。因此,x之前的集合是不能被购买的最大集合。 我希望我能正确理解你的问题。谢谢。 – geekkid

回答

0

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

你写了一个三重嵌套for循环,所以较大的n得到,这些循环得到较慢。如果让它运行得足够久,有可能会有一天成功完成;但是你的基本算法太慢了。

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

这是你的程序,以便编辑:

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的硬币。一个简单的“贪婪”算法,从最大的硬币开始并继续工作,将始终成功。这更有趣一点,因为“硬币”的设置很奇怪,而且有些值无法找到,所以也许经典的硬币问题并不像我想象的那么相关。

+0

非常感谢您的帮助。但我终于得到了我的算法工作,并且我不需要改变布尔语句中six_consequtive和-5到-7的布尔值。 – geekkid

+0

你的意思是McNuggets的数量是5,7和20吗? – steveha

0

对不起,我刚刚意识到我有颠倒的布尔值。循环开始的第一个six_consequtive应该被分配False和第二个True。 再次,我非常抱歉,这个愚蠢的问题。

+0

当你做出这个改变并运行程序时,它会得到答案45.如果你购买了5盒9个数量的McNuggets,5 * 9 == 45,所以这不是一个正确的答案。 – steveha

+0

如果您觉得这个问题没有用,您可以删除它。 – wberry

+0

你说得对,我也不得不把-5改成-7。我认为-5是一个错字:D。 – geekkid