题目描述:
如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 —— 就如海格告诉哈利的:“十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特(Knut)兑一个西可,很容易。”现在,给定哈利应付的价钱P和他实付的钱A,你的任务是写一个程序来计算他应该被找的零钱。
输入格式:
输入在1行中分别给出P和A,格式为“Galleon.Sickle.Knut”,其间用1个空格分隔。这里Galleon是[0, 107]区间内的整数,Sickle是[0, 17)区间内的整数,Knut是[0, 29)区间内的整数。
输出格式:
在一行中用与输入同样的格式输出哈利应该被找的零钱。如果他没带够钱,那么输出的应该是负数。
输入样例1:10.16.27 14.1.28输出样例1:
3.2.1输入样例2:
14.1.28 10.16.27输出样例2:
-3.2.1
思路:
将P和A全部转化为Knut之后进行运算,在对结果进行除基取余求出所要答案;
代码如下:
#include <cstdio>
struct money {
int gelleon;
int sickle;
int knut;
}p, a;
int main()
{
scanf ("%d.%d.%d", &p.gelleon, &p.sickle, &p.knut);
scanf ("%d.%d.%d", &a.gelleon, &a.sickle, &a.knut);
int price1, price2;
price1 = p.gelleon * 29 * 17 + p.sickle * 29 + p.knut; //转化为Knut进行计算;
price2 = a.gelleon * 29 * 17 + a.sickle * 29 + a.knut;
int ans = price2 - price1;
if (ans < 0) { //判断是否需要输出负号,和对结果进行修正;
printf ("-");
ans = -ans;
}
printf ("%d.%d.%d\n", ans / (29 * 17), ans % (29 * 17) / 29, ans % 29);
return 0;
}
再给出另一种思路:
P和A的加减从低位开始,不够减时向前一位借位(需考虑前一位为0的情况)。
代码如下:(相比之下过于繁琐,只用于参考思路)
#include <cstdio>
struct money {
int gelleon;
int sickle;
int knut;
}p, a, change;
bool more(money a, money b) { //判断P和A的大小;
if (a.gelleon != b.gelleon) return a.gelleon > b.gelleon;
if (a.sickle != b.sickle) return a.sickle > b.sickle;
return a.knut > b.knut;
}
void swap (money *a, money *b) { //用于交换P、A;
struct money temp;
temp = *a;
*a = *b;
*b = temp;
}
int main()
{
scanf ("%d.%d.%d", &p.gelleon, &p.sickle, &p.knut);
scanf ("%d.%d.%d", &a.gelleon, &a.sickle, &a.knut);
if (more (p, a) != 0) {
swap (&p, &a);
printf ("-");
}
if (a.knut >= p.knut) change.knut = a.knut - p.knut;
else {
change.knut = a.knut + 29 - p.knut;
if (a.sickle !=0) a.sickle--; //向sickle借位;
else { //sickle为0时,再向gelleon借位;
a.sickle = a.sickle + 17 - 1;
a.gelleon--;
}
}
if (a.sickle >= p.sickle) change.sickle = a.sickle - p.sickle;
else {
change.sickle = a.sickle + 17 - p.sickle;
a.gelleon--;
}
change.gelleon = a.gelleon - p.gelleon;
printf ("%d.%d.%d\n", change.gelleon, change.sickle, change.knut);
return 0;
}