【问题标题】:How to use nested for-loops to find the x and y of a linear equation如何使用嵌套的 for 循环来查找线性方程的 x 和 y
【发布时间】:2018-12-31 08:31:12
【问题描述】:

如果只有 160 张钞票,我试图找出 1760 美元中有多少张 10 美元和 50 美元的钞票。在朋友的帮助下,我认为使用嵌套的 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

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

【问题讨论】:

  • 一旦达到 1760,y 将永远不会递增,因为 ((10*i)+(50*y)
  • @JónásBalázs 这发生在 y=30 解释为什么 y 被“卡”在那里......

标签: python for-loop algebra


【解决方案1】:

欢迎来到 StackOverflow!

我的想法是逐个迭代每个 x 直到 160,如果然后 方程!= 1760,我将 y 增加 1 并重新启动。

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

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

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

从 cmets 编辑:

您的代码将看起来像这样:

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 循环并开始遍历 x 0 到 160 之间的每个数字,然后在该点之后,如果没有匹配是找到后,循环将再次运行(由于它是 for 循环而不是 while 循环,y 的增量已经自动发生了 1)。

【讨论】:

  • 您说“内部循环完成后,您需要将 y 增加 1。内部 for 循环是我假设的第二个循环。我不要将 y 增加1 外部for循环何时结束?
  • 还有。在第一个循环之后,第二个内部循环之前,我应该告诉计算机什么?
  • @OnurOzbek 请查看我的编辑。我建议的一个技巧是像我一样编写嵌套的 for 循环结构,仅打印出 x 和 y 值以查看发生了什么。然后你可以合并逻辑。
  • 谢谢你,rb612。如果您认为这个问题问得很好,您能给我点个赞吗?
【解决方案2】:

为什么你的 y 在 30 点被“卡住”:

一旦总和超过 1760,y 就不再增加,因为 (10*x + 50*y) &lt; 1760 始终是 False。这发生在x=31y=30,这就是为什么你的y '卡'在 30 岁。


您的方法几乎完成了,但是逻辑中有一个小错误

仅当金额超过所需总和时,您才可以将 10 元钞票运行至 160,而不是将 10 元钞票 x 增加到 160 并将 50 元钞票 y 加一并直接将每次迭代的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

【讨论】:

  • 谢谢。我已经接受了你的回答,但因为我的代表次数少于 15 次,所以很遗憾,我不能投票给你。如果您认为这是一个问得很好的问题,您能给我点个赞吗?
  • @OnurOzbek 我确实认为这是一个很好的问题!
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多