找零

找零

中等

簡介

在神祕的村莊 Coinholt 裡,你站在烘焙坊的櫃檯後方,正擺放著一批剛出爐的糕點。 門嘎吱一聲打開,走進來的是 Denara,一位眼光獨到、經驗豐富的商人。 快速用完一餐後,她把一枚閃閃發光的硬幣推過櫃檯,代表 100 單位的價值。

你微笑著收下硬幣,順便看了一眼這餐的總金額:88 單位。 這表示你得找回 12 單位的零錢。

Denara 滿懷期待地伸出手。 「只要給我數量最少的硬幣就好,」她笑著說。 「我的錢包已經滿了,我不想在路上冒險弄丟它們。」

你曉得自己有幾個選擇。 「我們有 Lumis(價值 10 單位)、Viras(價值 5 單位)和 Zenth(價值 2 單位)可以找零。」

你在腦中迅速盤算各種可能:

  • 一枚 Lumis(1 × 10 單位)加一枚 Zenth(1 × 2 單位)= 共 2 枚硬幣
  • 兩枚 Viras(2 × 5 單位)加一枚 Zenth(1 × 2 單位)= 共 3 枚硬幣
  • 六枚 Zenth(6 × 2 單位)= 共 6 枚硬幣

「最好的選擇是兩枚硬幣:一枚 Lumis 和一枚 Zenth,」你說著,把零錢交給她。

Denara 笑了,顯然很佩服。 「一如往常,你總是算得剛剛好。」

說明

找出要給顧客的最少硬幣數量,讓這些硬幣的值的總和等於正確的找零金額。

範例

  • 金額為 15,可用硬幣的值為 [1, 5, 10, 25, 100] 時,應該回傳一個值為 5 的硬幣和一個值為 10 的硬幣,也就是 [5, 10]。
  • 金額為 40,可用硬幣的值為 [1, 5, 10, 25, 100] 時,應該回傳一個值為 5 的硬幣、一個值為 10 的硬幣,以及一個值為 25 的硬幣,也就是 [5, 10, 25]。

例外訊息

有時候,你需要引發例外。這麼做時,一定要附上有意義的錯誤訊息,指出錯誤的來源。這能讓程式碼更容易閱讀,對除錯也有很大的幫助。如果你知道錯誤來源會是某種特定的型別,可以選擇引發其中一種內建錯誤型別,但仍然要附上有意義的訊息。

這個練習要求你使用 raise 敘述 來「拋出」ValueError,表示無法用給定的硬幣湊出零錢。只有在你同時raise這個exception並附上訊息時,測試才會通過。

若要以訊息引發ValueError,請把訊息寫成exception型別的引數:

# example when change cannot be made with the coins passed in
raise ValueError("can't make target with given coins")
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Python Exercism

準備好開始 找零 了嗎?

註冊 Exercism,透過 17 個概念146 個練習 和真人引導來學習並精通 Python,全部免費。