Python入門100道習題(4)——換散幣
阿新 • • 發佈:2019-01-05
題目描述
【問題描述】
將n元(n是100的倍數)換成用10元、5元、2元的組合(其中每一面值都可取0),一共有多少種組合?輸入n,輸出組合數。
【輸入形式】
輸入錢幣總額n
【輸出形式】
輸出組合數
【樣例輸入】
100
【樣例輸出】
66
知識點
- for迴圈
- if語句
- 判一個整數是否是偶數
有問題的解法
shumu=int(input())
count = 0
for n10 in range(shumu // 10 + 1):
for n5 in range(shumu // 5 + 1):
for n2 in range(shumu // 2 + 1):
if n10 * 10 + n5 * 5 + n2 * 2 == shumu:
count += 1
print(count)
上述解法存在的問題是,如果輸入的錢數n很大的話,程式執行時間過長。原因是上述程式的效率過低。以錢數是10000為例,迴圈的次數是1000 * 2000 * 5000。
下面的程式碼將在兩個方面做出改進,提升效率。
正確的解法
shumu=int(input())
count = 0
for n10 in range(shumu // 10 + 1):
for n5 in range((shumu - n10 * 10) // 5 + 1):
if (shumu - n10 * 10 - n5 * 5) % 2 == 0:
count += 1
print(count)
這個程式與上一個有問題的程式相比,有兩點優化:
1. 減少了一重迴圈。為什麼能減少呢?你想呀,當10塊錢的張數和5塊錢的張數定下來後,餘下來的錢數是固定的,記作remain。要麼,remain是偶數,能用2塊錢湊齊;要麼remain是奇數,不能用2塊錢湊齊。能用2塊錢湊齊,我們就增加1種換幣組合。這裡,壓根兒不用去窮舉2塊錢的張數。這樣,以錢數10000為例,迴圈的次數不大於1000 * 2000。
2. 減少了窮舉5塊錢張數的範圍。做法是,shumu - n10 * 10,也就是減去10塊錢湊起來的錢數。
小結
- 程式使用了雙重迴圈,值得仔細辨析,直至熟練。
- 迴圈次數是影響程式效率的重要因素。