找零

找零

中等

简介

在神秘的 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,全部免费。