c++ pat乙级1037
时间: 2025-04-28 11:25:19 浏览: 19
### C++ PAT 乙级 1037 题目解析
#### 霍格沃茨货币体系简介
霍格沃茨的货币单位有三种:加隆(Galleon),西可(Sickle),纳特(Knut)。其中,1 加隆等于 17 西可,而 1 西可又等于 29 纳特。
#### 输入处理
程序需接收两个金额数值作为输入,分别为购买价格 \(P\) 和支付金额 \(A\) 。两者均采用 `Galleon.Sickle.Knut` 的形式表示[^5]。
#### 计算找零逻辑
为了实现精确找零功能,需要先将给定的价格转换成最小单位——纳特,再执行减法运算得出应找回的钱数。具体步骤如下:
- 将 \(P\) 和 \(A\) 中各部分按照其对应价值折合成总纳特数量;
- 执行差额计算得到最终要返回给顾客的实际数额;
- 把上述结果反向拆分为对应的加隆、西可以及剩余纳特数目并输出。
```cpp
#include <iostream>
using namespace std;
struct Money {
long g, s, k;
};
Money toKnut(Money m){
return {(m.g * 17 + m.s) * 29 + m.k, 0, 0};
}
void fromKnut(long knut, Money& res){
res.g = knut / (17*29);
knut %= 17*29;
res.s = knut / 29;
res.k = knut % 29;
}
int main(){
char ch;
Money p={0}, a={0}, change={0};
// Read input values and convert them into Knuts.
scanf("%ld.%ld.%ld %c %ld.%ld.%ld", &p.g,&p.s,&p.k,&ch,&a.g,&a.s,&a.k);
auto pk = toKnut(p), ak = toKnut(a);
if(pk.k > ak.k){puts("-1");return 0;}
long diff = ak.k - pk.k;
fromKnut(diff,change);
printf("%ld.%ld.%ld\n", change.g, change.s, change.k);
}
```
此代码片段实现了从读取用户输入到完成找零过程的功能,并考虑到了当支付金额不足以覆盖商品成本时的情况(即直接输出 `-1`)。此外还包含了必要的结构体定义用于存储不同面值的数量及其相互之间的转换函数。
阅读全文
相关推荐

















