如何使用嵌套 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=31
和 y=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
如果只有 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=31
和 y=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