python演算法:換硬幣

刘宏缔的架构森林發表於2024-05-16

一,for迴圈:

1,功能:重複執行同一段程式碼
語法:

for index in range(n): 
    # 迴圈體程式碼

index : 用來依次接收可迭代物件中的元素的變數名
range()函式:負責返回整數序列

流程圖:

python演算法:換硬幣

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=" ")

執行結果同上

相關文章