如果满足某些条件,则退出for / while循环

时间:2015-05-27 09:47:31

标签: python

我写了一组代码来计算丢番图方程:

bestSoFar = 0     
packages = (6,9,20)   
numMc = 0
guess= 0
possibn = []
for n in xrange(1, 150):   
   for a in xrange(0, (n/ packages[0]) +1):
       for b in xrange(0,(n/ packages[1]) +1):
           c = (n - packages[0]* a - b * packages[1]) / packages[-1]
           numMc = packages[0] *a + packages[1] * b + packages[-1] * c
           if numMc == n and n not in possibn:
               possibn.append(n)
               print possibn
               if len(possibn) >6 and possibn [-1] - possibn[-6] == 5:
                  bestSoFar = n
                  break

原始问题集是由麻省理工学院课程设计的。基本上是通过安排不同大小的包装的比例来计算可以购买的McNuggets的数量(麦当劳在一个包装中做6,9,20个McNuggets)。比如,通过购买两个6-McNuggets和一个9-McNuggets可以买到21个McNuggets。如果可以用精确数量的包装购买McNuggets的数量,我将它们存储在一个列表中。结果发现,如果也可以准确地购买6个连续数字,那么剩下的数字也是可能的。

从我的代码中得到bestSoFar = 149的结果,而期望的答案是40.原因是它一直循环直到n达到149.我想在40处停止(使用break语句)。然而,它失败了,我正在为你们寻求建议。此外,如果无论如何更快/更容易地编程问题,我也很高兴知道并学习它。

非常感谢你。 凯西

3 个答案:

答案 0 :(得分:1)

如果您不应该使用某个函数,只需指定一个变量来导致其他循环中断。

bestSoFar = 0     
packages = (6,9,20)   
numMc = 0
guess= 0
possibn = []
finished = False
for n in xrange(1, 150):   
   for a in xrange(0, (n/ packages[0]) +1):
       for b in xrange(0,(n/ packages[1]) +1):
           c = (n - packages[0]* a - b * packages[1]) / packages[-1]
           numMc = packages[0] *a + packages[1] * b + packages[-1] * c
           if numMc == n and n not in possibn:
               possibn.append(n)
#               print possibn
               if len(possibn) >6 and possibn [-1] - possibn[-6] == 5:
                  bestSoFar = n
                  finished = True
                  break
   if finished: break
print bestSoFar

答案 1 :(得分:0)

将其转换为函数return

from __future__ import print_function


def solve(*packages):
    bestSoFar = 0
    numMc = 0
    guess= 0
    possibn = []
    for n in xrange(1, 150):
       for a in xrange(0, (n / packages[0]) + 1):
           for b in xrange(0, (n / packages[1]) + 1):
               c = (n - packages[0] * a - b * packages[1]) / packages[-1]
               numMc = packages[0] * a + packages[1] * b + packages[-1] * c
               if numMc == n and n not in possibn:
                   possibn.append(n)
                   print possibn
                   if len(possibn) > 6 and possibn [-1] - possibn[-6] == 5:
                      return n
    return bestSoFar

x = solve(6, 9, 20)
print(x)

答案 2 :(得分:-1)

我实际上并不清楚你的期望。但是,我所看到的是你想要打破一切。你给出的休息只退出内循环。将另一个break语句放在内循环之外和第一循环内。