算法小讲常第6课 换钱组合,我的输出怎么和书上的不一样?
本帖最后由 glyzd 于 2024-4-13 23:21 编辑我的代码:
count = 0
print("可能兑换的组合有以下几种:")
for x in range(0,51,10):
for y in range(0,51-x,5):
for z in range(0,51-x-y):
if x+y+z ==50:
print(f"第{count+1}种,10元{x//10}张,5元{y//5}张,1元{z}张 ",end = "")
if (count % 3 == 0):
print("")
count += 1
print(f"一共有{count}种组合")
为什么输出的时候第一行只有第一种组合输出,而不是书上的第一行就有三种组合?
经检查,和书上的代码没有区别啊?
你的代码有一个小问题,导致了输出的不同。在第一层循环中,你设置的范围是从0到50,每次递增10元。然后,在第二层循环中,你设置的范围是从0到50减去第一层循环变量的值,每次递增5元。最后,在第三层循环中,你设置的范围是从0到50减去前两个循环变量的值。
这里的问题是,你只考虑了最大可能性下的组合情况,而没有考虑其他可能性。比如说,在第一层循环中,当x为50时,第二层循环只能取0到1,第三层循环只能取0到49。这导致了只有一种组合符合条件,因此只输出了一种组合。
为了解决这个问题,你需要更改你的代码逻辑。可以把第一层循环设置成0到5张10元钞票,第二层循环设置成0到10张5元钞票,第三层循环设置成0到50张1元钞票。这样,你将会得到所有可能的组合情况,而不只是最大可能性下的组合。
下面是修改后的代码:
count = 0
print("可能兑换的组合有以下几种:")
for x in range(0, 6):
for y in range(0, 11):
for z in range(0, 51):
if (x*10 + y*5 + z == 50):
print(f"第{count+1}种,10元{x}张,5元{y}张,1元{z}张", end=" ")
if (count % 3 == 0):
print("")
count += 1
print(f"一共有{count}种组合")
现在,你将会得到和书上一样的输出结果,其中第一行就有三种组合。希望这能解决你的问题!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 本帖最后由 jackz007 于 2024-4-14 00:57 编辑
count = 0
print("可能兑换的组合有以下几种:")
for x in range(0,51,10):
for y in range(0,51-x,5):
for z in range(0,51-x-y):
if x+y+z ==50:
print(f"第{count+1}种,10元{x//10}张,5元{y//5}张,1元{z}张 ",end = "")
if (count % 3 == 0): # 先判断,这个时候还没有更新计数
print("")
count += 1 # 【问题】:再计数
print(f"一共有{count}种组合")
由于没有及时更新 count,导致在打印完第 1 种组合后,count 的值仍然是 0,而 0 % 3 的值肯定为 0 ,所以,就打印回车换行了。于是,我们就看到,第 1 行只显示了 1 种组合。从而,不符合预期。修改方法很简单,把第10行语句移动到第8行之前即可
count = 0
print("可能兑换的组合有以下几种:")
for x in range(0,51,10):
for y in range(0,51-x,5):
for z in range(0,51-x-y):
if x+y+z ==50:
print(f"第{count+1}种,10元{x//10}张,5元{y//5}张,1元{z}张 ",end = "")
count += 1 # 【修改】:先计数
if (count % 3 == 0): # 再判断
print("")
print(f"一共有{count}种组合")
运行实况:
D:\\Python>python x.py
可能兑换的组合有以下几种:
第1种,10元0张,5元0张,1元50张 第2种,10元0张,5元1张,1元45张 第3种,10元0张,5元2张,1元40张
第4种,10元0张,5元3张,1元35张 第5种,10元0张,5元4张,1元30张 第6种,10元0张,5元5张,1元25张
第7种,10元0张,5元6张,1元20张 第8种,10元0张,5元7张,1元15张 第9种,10元0张,5元8张,1元10张
第10种,10元0张,5元9张,1元5张 第11种,10元0张,5元10张,1元0张 第12种,10元1张,5元0张,1元40张
第13种,10元1张,5元1张,1元35张 第14种,10元1张,5元2张,1元30张 第15种,10元1张,5元3张,1元25张
第16种,10元1张,5元4张,1元20张 第17种,10元1张,5元5张,1元15张 第18种,10元1张,5元6张,1元10张
第19种,10元1张,5元7张,1元5张 第20种,10元1张,5元8张,1元0张 第21种,10元2张,5元0张,1元30张
第22种,10元2张,5元1张,1元25张 第23种,10元2张,5元2张,1元20张 第24种,10元2张,5元3张,1元15张
第25种,10元2张,5元4张,1元10张 第26种,10元2张,5元5张,1元5张 第27种,10元2张,5元6张,1元0张
第28种,10元3张,5元0张,1元20张 第29种,10元3张,5元1张,1元15张 第30种,10元3张,5元2张,1元10张
第31种,10元3张,5元3张,1元5张 第32种,10元3张,5元4张,1元0张 第33种,10元4张,5元0张,1元10张
第34种,10元4张,5元1张,1元5张 第35种,10元4张,5元2张,1元0张 第36种,10元5张,5元0张,1元0张
一共有36种组合
D:\\Python>
以下是我改写的版本,谨供楼主参考
count = 0
print('可能兑换的组合有以下几种:')
for a in range(6) : # 10 元 0 ~ 5张
for b in range(11) : #5 元 0 ~ 10 张
for c in range(51): #1 元 0 ~ 50 张
if 10 * a + 5 * b + c == 50 :
count += 1
print('【第%2d种】:10元%1d张,5元%2d张,1元%2d张 ' % (count , a , b , c) , end = '')
if count % 3 == 0 :
print()
print('一共有%d种组合' % count)
运行实况:
D:\\Python>python x.py
可能兑换的组合有以下几种:
【第 1种】:10元0张,5元 0张,1元50张 【第 2种】:10元0张,5元 1张,1元45张 【第 3种】:10元0张,5元 2张,1元40张
【第 4种】:10元0张,5元 3张,1元35张 【第 5种】:10元0张,5元 4张,1元30张 【第 6种】:10元0张,5元 5张,1元25张
【第 7种】:10元0张,5元 6张,1元20张 【第 8种】:10元0张,5元 7张,1元15张 【第 9种】:10元0张,5元 8张,1元10张
【第10种】:10元0张,5元 9张,1元 5张 【第11种】:10元0张,5元10张,1元 0张 【第12种】:10元1张,5元 0张,1元40张
【第13种】:10元1张,5元 1张,1元35张 【第14种】:10元1张,5元 2张,1元30张 【第15种】:10元1张,5元 3张,1元25张
【第16种】:10元1张,5元 4张,1元20张 【第17种】:10元1张,5元 5张,1元15张 【第18种】:10元1张,5元 6张,1元10张
【第19种】:10元1张,5元 7张,1元 5张 【第20种】:10元1张,5元 8张,1元 0张 【第21种】:10元2张,5元 0张,1元30张
【第22种】:10元2张,5元 1张,1元25张 【第23种】:10元2张,5元 2张,1元20张 【第24种】:10元2张,5元 3张,1元15张
【第25种】:10元2张,5元 4张,1元10张 【第26种】:10元2张,5元 5张,1元 5张 【第27种】:10元2张,5元 6张,1元 0张
【第28种】:10元3张,5元 0张,1元20张 【第29种】:10元3张,5元 1张,1元15张 【第30种】:10元3张,5元 2张,1元10张
【第31种】:10元3张,5元 3张,1元 5张 【第32种】:10元3张,5元 4张,1元 0张 【第33种】:10元4张,5元 0张,1元10张
【第34种】:10元4张,5元 1张,1元 5张 【第35种】:10元4张,5元 2张,1元 0张 【第36种】:10元5张,5元 0张,1元 0张
一共有36种组合
D:\\Python> 太感谢了!仔细回头去看书,是我没看仔细!也非常感谢您的指导,不胜感激!@jackz007
页:
[1]