哈喽各位新手宝子~ 之前给大家讲了红军干粮分配的编程题,有宝子问能不能改成「双层循环」,还不要found标志位,安排!
今天就带来 纯双层循环+列表存结果 的版本,逻辑简单到默写无压力,新手也能一眼看懂✅
先回顾题目(怕宝子忘啦)
已知:总干粮total(10≤total≤100),分两种袋子装:
甲袋:每袋装5份,至少用1个
乙袋:每袋装8份,至少用1个
要求:两种袋子都用、干粮恰好装完,输出所有甲袋(a)、乙袋(b)组合(按甲袋从小到大),没有就输出None。
核心思路(重点!)
不用标志位,我们只用「列表」来搞定:
定义一个空列表result,专门存符合条件的(a,b)组合;
外层循环:枚举所有可能的甲袋数量a(从1开始,不用算太死范围,给个合理值即可);
内层循环:对每个a,枚举所有可能的乙袋数量b(也从1开始);
判断:如果5*a + 8*b 等于总干粮数,就把(a,b)存进列表;
最后判断列表:有内容就逐行输出,空列表就输出None。
核心就是「暴力枚举」——把所有可能的a和b都试一遍,符合条件就存起来,最后看存没存到东西~
完整代码(可直接复制运行)
# 读取输入的总干粮份数total = int(input())# 定义空列表,专门存符合条件的组合(不用found标志!)result = []# 双层循环:外层枚举甲袋数量a,内层枚举乙袋数量b# 范围给1~21(足够覆盖10~100份干粮的所有可能,新手不用纠结范围)for a in range(1, 21): for b in range(1, 21): # 判断是否恰好装完所有干粮 if 5 * a + 8 * b == total: # 符合条件,就把(a,b)存进列表 result.append((a, b))# 最后判断列表,输出结果if result: # 列表有内容,逐行输出每组组合 for a, b in result: print(a, b)else: # 列表为空,说明没有符合条件的组合 print("None")
逐行拆解(新手必看)
1. 输入处理:total = int(input()) → 读取我们输入的总干粮数(比如53、26);
2. 空列表:result = [] → 相当于一个“小篮子”,专门装正确的(a,b)组合;
3. 外层循环for a in range(1, 21):a从1到20,挨个试甲袋的数量(1个、2个...20个);
4. 内层循环for b in range(1, 21):对每个a,b从1到20挨个试乙袋的数量;
5. 条件判断:5*a + 8*b == total → 试出来刚好装完,就把(a,b)放进“小篮子”;
6. 输出:如果“小篮子”里有东西,就把里面的组合逐行打印;如果是空的,就打印None。
案例测试(直观感受)
举3个典型例子,帮大家验证代码好不好用:
案例1:输入53
循环过程中,会找到两组符合条件的组合:
a=1时,b=6 → 5×1 + 8×6 = 53;
a=9时,b=1 → 5×9 + 8×1 = 53;
列表result里就有[(1,6), (9,1)],输出就是:
1 6
9 1
案例2:输入26
a=2,b=2 → 5×2 + 8×2 = 26,列表里只有[(2,2)],输出:2 2
案例3:输入15
所有a和b试一遍,都达不到5a+8b=15,列表是空的,输出:None
新手小提醒
循环范围1~21完全够用,因为最大total=100,甲袋最多20个(5×20=100),乙袋最多12个(8×12=96),给21的范围是留了冗余,不用精确计算;
全程没有用found=True/False,只用列表存结果,逻辑更清爽,新手更容易理解;
复制代码直接运行,输入题目给的测试用例,就能得到正确输出~
总结一下:双层循环暴力枚举所有a和b,用列表存正确答案,最后判断列表是否为空即可。这种写法不用记复杂的标志位,新手闭眼冲!
如果还是没看懂某个步骤,评论区留言,帮你再拆细~