1. 项目背景与需求分析
"PTA 1037在霍格沃茨找零钱"这个题目乍看有些奇幻色彩,但实际上是编程初学者常见的一类货币换算练习题。这类题目通常要求我们模拟现实中的货币兑换场景,通过编程实现自动化的找零计算。
在魔法世界的设定下,货币系统往往与现实中不同。以《哈利波特》系列为例,霍格沃茨的货币体系包含三种硬币:
- 加隆(Galleon):最高面值,1加隆=17西可
- 西可(Sickle):中等面值,1西可=29纳特
- 纳特(Knut):最小面值
这种非十进制的货币换算方式,与我们日常使用的人民币(1元=10角=100分)有着显著差异,也正因如此,这类题目对编程初学者的数据类型处理和算法逻辑提出了更高要求。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题建模与输入输出规范
2.1 题目具体要求解析
虽然原始题目描述较为简略,但根据PTA(程序设计类实验辅助教学平台)的题目风格和编号1037的惯例,我们可以合理推断题目要求:
输入格式:
- 两行数据,分别表示应付金额和实付金额
- 每行格式为:Galleon.Sickle.Knut(例如"10.16.27"表示10加隆16西可27纳特)
输出格式:
- 找零结果,格式与输入相同
- 如果实付不足,需要在数值前加负号
示例:
输入:
10.16.27
14.1.28
输出:
3.2.1
2.2 货币系统的统一转换
处理这类问题的核心思路是将所有货币统一转换为最小单位进行计算。具体步骤如下:
-
将输入的加隆、西可、纳特全部转换为纳特:
- 总纳特数 = Galleon×17×29 + Sickle×29 + Knut
-
计算差额(实付 - 应付)的纳特数
-
将差额纳特数转换回加隆、西可、纳特:
- Galleon = 差额 // (17×29)
- 剩余 = 差额 % (17×29)
- Sickle = 剩余 // 29
- Knut = 剩余 % 29
注意:在Python中,//表示整除,%表示取模运算
3. 代码实现与边界处理
3.1 基础版本实现
以下是Python的基础实现代码:
python复制def wiz_money(pay, given):
# 将支付和收取的金额转换为纳特
def to_knuts(g, s, k):
return g * 17 * 29 + s * 29 + k
# 解析输入字符串
g_p, s_p, k_p = map(int, pay.split('.'))
g_g, s_g, k_g = map(int, given.split('.'))
total_p = to_knuts(g_p, s_p, k_p)
total_g = to_knuts(g_g, s_g, k_g)
diff = total_g - total_p
# 处理差额为负的情况
sign = ''
if diff < 0:
sign = '-'
diff = abs(diff)
# 转换回加隆、西可、纳特
g = diff // (17 * 29)
remaining = diff % (17 * 29)
s = remaining // 29
k = remaining % 29
return f"{sign}{g}.{s}.{k}"
# 示例测试
print(wiz_money("10.16.27", "14.1.28")) # 输出: 3.2.1
3.2 边界情况处理
在实际编码中,我们需要特别注意以下边界情况:
-
输入验证:
- 检查输入格式是否符合G.S.K的模式
- 确保每个数值都是非负整数
- 西可和纳特是否在有效范围内(西可<17,纳特<29)
-
零钱处理:
- 当某一级货币为0时,仍要显示(如2.0.15而非2..15)
- 负数的处理要确保所
