python算法:换硬币
一,for循环:
1,功能:重复执行同一段代码
语法:
for index in range(n): 
    # 循环体代码
index : 用来依次接收可迭代对象中的元素的变量名
range()函数:负责返回整数序列
流程图:

2,应用
range可以同时指定start 和stop,用for遍历并打印
| 
 1 
2 
3 
4 
 | 
# 指定 start和stop# print的参数 end=" " 用来使打印不换行for num in range(3,9):    print(num, end=" ") | 
运行结果:
3 4 5 6 7 8 
说明:刘宏缔的架构森林—专注it技术的博客,
网址:https://imgtouch.com
本文: https://blog.imgtouch.com/index.php/2024/03/29/python-suan-fa-huan-ying-bi/
代码: https://github.com/liuhongdi/ 或 https://gitee.com/liuhongdi
说明:作者:刘宏缔 邮箱: 371125307@qq.com
二,换硬币的题目与分析
1,题目:
将5元的人民币兑换成1元、5角和1角的硬币,
共有多少种不同的兑换方法?
2,分析:
设变量x、y和z分别代表兑换的1元、5角和1角的硬币的个数
根据题目的要求,可得到如下的方程:以1角为单位:
10X+5y+z=50
根据题意可知x、y和z的取值范围:
1元硬币,从0个到5个
5角硬币,   从0个到10个
1角硬币,   从0个到50个
为实现该功能,需要使用三个嵌套的for循环语句,
根据三个取值范围循环即可
三,编写代码:
1,第一版:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
 | 
# 变量x、y和z分别代表兑换的1元、5角和1角的硬币所具有的钱数(角)count = 0  # 计数器print("可能的兑换方法如下:")for x in range(0, 5 + 1):  # 1元硬币,从0个到5个    for y in range(0, 10+1):  # 5角硬币,最多10个        for z in range(0, 50 + 1):   # 1角硬币,最多50个            if x*10 + y*5 + z == 50:                count += 1                if count % 3 == 0:  # 每3列一行                    print(count, end=" ")                    print(f"1元:{x} 5角:{y} 1角:{z} \t")                else:                    print(count, end=" ")                    print(f"1元:{x} 5角:{y} 1角:{z} \t", end=" ") | 
运行结果:
可能的兑换方法如下:
1 1元:0 5角:0 1角:50 	 2 1元:0 5角:1 1角:45 	 3 1元:0 5角:2 1角:40 	
4 1元:0 5角:3 1角:35 	 5 1元:0 5角:4 1角:30 	 6 1元:0 5角:5 1角:25 	
7 1元:0 5角:6 1角:20 	 8 1元:0 5角:7 1角:15 	 9 1元:0 5角:8 1角:10 	
10 1元:0 5角:9 1角:5 	 11 1元:0 5角:10 1角:0 	 12 1元:1 5角:0 1角:40 	
13 1元:1 5角:1 1角:35 	 14 1元:1 5角:2 1角:30 	 15 1元:1 5角:3 1角:25 	
16 1元:1 5角:4 1角:20 	 17 1元:1 5角:5 1角:15 	 18 1元:1 5角:6 1角:10 	
19 1元:1 5角:7 1角:5 	 20 1元:1 5角:8 1角:0 	 21 1元:2 5角:0 1角:30 	
22 1元:2 5角:1 1角:25 	 23 1元:2 5角:2 1角:20 	 24 1元:2 5角:3 1角:15 	
25 1元:2 5角:4 1角:10 	 26 1元:2 5角:5 1角:5 	 27 1元:2 5角:6 1角:0 	
28 1元:3 5角:0 1角:20 	 29 1元:3 5角:1 1角:15 	 30 1元:3 5角:2 1角:10 	
31 1元:3 5角:3 1角:5 	 32 1元:3 5角:4 1角:0 	 33 1元:4 5角:0 1角:10 	
34 1元:4 5角:1 1角:5 	 35 1元:4 5角:2 1角:0 	 36 1元:5 5角:0 1角:0 	
2,优化循环的范围:
已知1元硬币的数量时,5角和1角硬币不需要循环全部范围
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
 | 
# 变量x、y和z分别代表兑换的1元、5角和1角的硬币所具有的钱数(角)count = 0  # 计数器print("可能的兑换方法如下:")for x in range(0, 5 + 1):  # 1元硬币,从0个到5个    j5end = int((10*5 - x*10)/5)   # 5角硬币,最多10个    for y in range(0, j5end+1):        j1end = 50 - x*10 - y*5    # 1角硬币,最多50个        for z in range(0, j1end + 1):            if (x*10 + y*5 + z == 50):                count += 1                if count % 3 == 0:  # 每3列一行                    print(count, end=" ")                    print(f"1元:{x} 5角:{y} 1角:{z} \t")                else:                    print(count, end=" ")                    print(f"1元:{x} 5角:{y} 1角:{z} \t", end=" ") | 
运行结果同上
3,优化循环的层数:
已知1元硬币和5角硬币的数量时,1角硬币的数量已可以确定,无需再循环一层
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
 | 
# 变量x、y和z分别代表兑换的1元、5角和1角的硬币所具有的钱数(角)count = 0   # 计数器print("可能的兑换方法如下:")for x in range(0, 5 + 1):   # 1元硬币,从0个到5个    j5end = int((10 * 5 - x * 10) / 5)   # 5角硬币,最多10个    for y in range(0, j5end+1):   # 5角硬币,最多10个        z = 50 - x * 10 - y * 5        if z >= 0:            count += 1            if count % 3 == 0:  # 每3列一行                print(count, end=" ")                print(f"1元:{x} 5角:{y} 1角:{z} \t")            else:                print(count, end=" ")                print(f"1元:{x} 5角:{y} 1角:{z} \t", end=" ") | 
运行结果同上
                    
                
                
            
        
浙公网安备 33010602011771号