如何使用嵌套 for 循环查找线性方程的 x 和 y

How to use nested for-loops to find the x and y of a linear equation

如果只有 160 张纸币,我想知道有多少张 10 美元和 50 美元的纸币变成 1760 美元。我认为,在朋友的帮助下,使用嵌套的 for 循环是最好的方法,但我在实施时遇到了问题。我的想法是逐个迭代每个 x 直到 160,如果方程式 != 1760,我将 y 递增 1 并重新启动。

这些是等式: 10x + 50y = 1760, x + y = 160

我想要的输出是:10(156) + 50(4) = 1760。但到目前为止,我得到的只是:

10(1) + 50(0) = 10
10(2) + 50(1) = 70
10(3) + 50(2) = 130
10(4) + 50(3) = 190
10(5) + 50(4) = 250
...
...
...
10(156) + 50(30) = 3060
10(157) + 50(30) = 3070
10(158) + 50(30) = 3080
10(159) + 50(30) = 3090
10(160) + 50(30) = 3100

出于某种原因,当 x = 31 时,y 一直停留在 30。我不知道为什么。无论如何,这是我的代码:

for i in range(1, 161):
    print("10" + "(" + str(i) + ") + 50" + "(" + str(y) + ")" + " = " + str((10*i)+(50*y)))
    if ((10*i)+(50*y) < 1760):
        y += 1

我不想要确切的答案。我只想知道我哪里出错了。

欢迎使用 Whosebug!

My idea is to iterate every x one-by-one until 160 and if then the equation != 1760, I increment y by 1 and restart.

这里的问题是您实际上并没有编写嵌套的 for 循环。嵌套的 for 循环的形式为:

for(...):
   ...
   for(...):

相反,即使您第一次经历 x,您也会递增 y,因为您有 if 语句。它得到 "stuck" 因为 30*10+29*50 = 1750,但是一旦你再次 运行 循环,31*10+30*50 = 1810 大于 1760,因此 if 语句计算为 false 和 y 永远不会再增加。因此,您需要像我上面演示的那样创建两个嵌套的 for 循环,并且在内部循环完成后,您需要将 y 递增 1(这是 for 循环自动执行的操作)。

根据评论编辑:

您的代码看起来像这样:

for y in range(0,161):
   ...
   for x in range(0,161):
      ... #go through and check if the equations are satisfied

注意上面等价于:

x = 0
y = 0
while(y <= 160):
   ...
   while(x <= 160):
      ... #go through and check if the equations are satisfied
      x+=1 #add 1 to x
   y+=1 #when the second loop is done iterating, add 1 to y and loop again

如果你检查这里发生了什么,当 y=0 时,计算机将看到内部 for 循环并开始 运行 遍历 0 到 160 之间 x 的每个数字,然后在那之后,如果没有找到匹配项,循环将再次 运行 (因为它是 for 循环而不是 while 循环,所以 y 递增 1 已经自动发生)。

为什么你的 y 在 30 岁时得到 'stuck':

一旦总和超过 1760,y 将不再递增,因为 (10*x + 50*y) < 1760 始终是 False。这发生在 x=31y=30,这就是为什么你的 y 在 30 时 'stuck'。


您的方法即将完成,但逻辑中存在一个小错误

而不是 运行将 10 钞票 x 增加到 160 并仅在金额超过所需金额时才将 50 钞票 y 增加一,你可以运行 10-bills 到160,直接设置每次迭代50-bills 的数量为y = 160 - x。这是因为您强制执行此条件 (160 = x + y),因此只需要考虑满足此要求的配置。

所以,你是对的 你只需要一个 for 循环 ,但你可以在每次迭代中直接将 y 设置为 160 = x + y,然后你只需要检查金额是否正确即可。

所以这个解决方案的 Ansatz 看起来像:

for x in range(0, 161):
    y = 160 - x
    # calculate the sum
    # if the sum is correct, break

抱歉,还不能发表评论。 rb612 已经正确地解释了这个问题。

将第二行之后的代码替换为

for y in range(1, 160-i):
     if((10*i)+(50*y) <= 1760):
          y += 1
     else: break