Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 丢番图方程的实现_Python - Fatal编程技术网

Python 丢番图方程的实现

Python 丢番图方程的实现,python,Python,我被要求做以下工作: 如果可以购买x,x+1,…,x+5套McNuggets,对于某些x,则可以购买任意数量的McNuggets>=x,因为McNuggets有6包、9包和20包。编写一个迭代程序,找出最大数量的McNuggets,这些McNuggets不能以精确的数量购买 下面是我提出的代码,但它被困在一个无限循环中: count = 0 n = 1 while count < 6: six_consequtive = True for a in range(n):

我被要求做以下工作: 如果可以购买x,x+1,…,x+5套McNuggets,对于某些x,则可以购买任意数量的McNuggets>=x,因为McNuggets有6包、9包和20包。编写一个迭代程序,找出最大数量的McNuggets,这些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))
count=0
n=1
当计数小于6时:
六个条件=真
对于范围(n)内的a:
对于范围(n)内的b:
对于范围(n)内的c:
如果6*a+9*b+20*c==n:
六个条件=假
如果有六个条件:
计数+=1
其他:
计数=0
n+=1
打印(“无法购买准确数量的McNuggets的最大数量:%d.”%(n-5))

多谢各位

问题似乎很清楚:只有在可能得到确切数量时,才能增加
count
。只要不增加计数,就将其重置为0,循环仅在超过6时停止。那可能需要一段时间

您为循环编写了一个三重嵌套的
,因此
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))
导入系统 def输出: 系统标准输出写入(s+“\n”) sys.stdout.flush() 计数=0 n=1 当计数小于6时: 连续六次=正确 对于范围(n)内的a: 对于范围(n)内的b: 对于范围(n)内的c: #输出(“a:%d b:%d c:%d n:%d”%(a,b,c,n)) 如果6*a+9*b+20*c==n: 连续六次=错误 输出(“n==%d个计数==%d个连续==%s”% (n,count,str(连续六次))) 如果连续六次: 计数+=1 其他: 计数=0 n+=1 打印(“无法购买准确数量的McNuggets的最大数量:%d.”%(n-5))
我还将拼写改为“六个连续”

那么,你应该如何解决这个问题?我认为你应该扔掉这个,用更好的算法重写。您可能想查看其他人是如何解决此问题或类似问题的。这让我印象深刻,因为当给一组不同面值的硬币时,这与如何兑换的经典问题非常相似


注:进行更改的经典问题通常假设有一套合理的硬币,包括价值为1的硬币。一个简单的“贪婪”算法,从最大的硬币开始,一直到最后,总会成功。这有点有趣,因为“coins”集合很奇怪,而且有一些值无法找到,所以可能经典的coins问题没有我想象的那么重要。

对不起,我刚刚意识到我颠倒了布尔值。循环开始处的前六个consequentive应指定为False,第二个为True。
我再次为这个愚蠢的问题感到抱歉

当您进行此更改并运行程序时,它将得到答案45。如果你买了5盒9支的McNuggets,5*9==45,那么这不是一个正确的答案。如果你觉得这个问题没有用,你可以删除它。你是对的,我还必须将-5改为-7。我认为-5是一个打字错误:D。你能解释一下“连续六次”测试的目的吗?你的家庭作业有没有说,一旦你在一行中找到六个具有某些属性的值,你就可以假设你得到了答案?如果是这样的话,你能描述一下这个属性吗?是的,正如我在关于ve的问题中所说的,如果可以为一些x购买x,x+1,…,x+5套McNuggets,那么可以购买任意数量的McNuggets>=x,因为McNuggets有6包、9包和20包。这是因为,如果你找到6个反求集,你总是可以无限地向每个反求集添加6个。因此,x组之前的那套是买不到的最大的一套。我希望我正确理解了你的问题。谢谢。非常感谢你的帮助。但是我终于让我的算法运行起来了,我不认为我只需要在print语句中更改six_consequentive和-5到-7中的布尔值。你是说McNuggets的数量是5、7和20吗?