1037 在霍格沃茨找零钱
分数 20
作者 CHEN, Yue
单位 浙江大学
如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 ——
就如海格告诉哈利的:“十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特(Knut)兑一个西可,很容易。”现在,给定哈利应付的价钱
P 和他实付的钱 A,你的任务是写一个程序来计算他应该被找的零钱。
输入格式:
输出格式:
在一行中用与输入同样的格式输出哈利应该被找的零钱。如果他没带够钱,那么输出的应该是负数。
输入样例 1:
10.16.27 14.1.28
输出样例 1:
3.2.1
输入样例 2:
14.1.28 10.16.27
输出样例 2:
-3.2.1
题目分析
1、输入
输入在 1 行中分别给出 P 和 A,应付的价钱 P 和他实付的钱 A。
格式为:Galleon.Sickle.Knut Galleon.Sickle.Knut
我先用了结构体,去构建Money,存储Galleon.Sickle.Knut,一组数据。
//定义结构体Galleon.Sickle.Knut
struct Money{
int Galleon;
int Sickle;
int Knut;
}pmoney,amoney,nmoney,temp;
应付的价钱 P ,存储在pmoney;和他实付的钱 A,存储在amoney;
scanf("%d.%d.%d %d.%d.%d",&pmoney.Galleon,&pmoney.Sickle,&pmoney.Knut,&amoney.Galleon,&amoney.Sickle,&amoney.Knut);
2、输出
在一行中用与输入同样的格式输出哈利应该被找的零钱。如果他没带够钱,那么输出的应该是负数。
**第一步:**判断他实付的钱 amoney 是否小于应付的价钱 pmoney,用n记录;如果是小于,则交换数据,且n=-1;(解决输出是负数)
if(amoney.Galleon<pmoney.Galleon){//如果a比b小,则交换a和b
temp.Galleon=amoney.Galleon;
temp.Sickle=amoney.Sickle;
temp.Knut=amoney.Knut;
amoney.Galleon=pmoney.Galleon;
amoney.Sickle=pmoney.Sickle;
amoney.Knut=pmoney.Knut;
pmoney.Galleon=temp.Galleon;
pmoney.Sickle=temp.Sickle;
pmoney.Knut=temp.Knut;
n=-1;
}
第二步:用amoney(Galleon.Sickle.Knut) 数据减去pmoney(Galleon.Sickle.Knut),算出nmoney哈利应该被找的零钱。
注意:
1个Galleon兑换17Sickle
1个Sickle兑换29Knut
- 先计算Knut,用amoney.Knut-pmoney.Knut;
如果nmoney.Knut是负数,则amoney.Sickle-1,nmoney.Knut+29。
nmoney.Knut=amoney.Knut-pmoney.Knut;
if(nmoney.Knut<0){
amoney.Sickle=amoney.Sickle-1;
nmoney.Knut=nmoney.Knut+29;
}
- 同理计算Sickle;
nmoney.Sickle=amoney.Sickle-pmoney.Sickle;
if(nmoney.Sickle<0){
amoney.Galleon=amoney.Galleon-1;
nmoney.Sickle=nmoney.Sickle+17;
}
- 计算Galleon,直接相减,但是最后别忘记了乘符号n。
nmoney.Galleon=(amoney.Galleon-pmoney.Galleon)*n;
第三步:输出结果;nmoney
printf("%d.%d.%d",nmoney.Galleon,nmoney.Sickle,nmoney.Knut);
3、碎碎念
我用的是结构体,算法结构当中用的是全部先换成Knut,去计算。
代码如下
1、自己写的
#include<stdio.h>
struct Money{
int Galleon;
int Sickle;
int Knut;
}pmoney,amoney,nmoney,temp;
int main(){
int n=1;
scanf("%d.%d.%d %d.%d.%d",&pmoney.Galleon,&pmoney.Sickle,&pmoney.Knut,&amoney.Galleon,&amoney.Sickle,&amoney.Knut);
if(amoney.Galleon<pmoney.Galleon){//如果a比b小,则交换a和b
temp.Galleon=amoney.Galleon;
temp.Sickle=amoney.Sickle;
temp.Knut=amoney.Knut;
amoney.Galleon=pmoney.Galleon;
amoney.Sickle=pmoney.Sickle;
amoney.Knut=pmoney.Knut;
pmoney.Galleon=temp.Galleon;
pmoney.Sickle=temp.Sickle;
pmoney.Knut=temp.Knut;
n=-1;
}
nmoney.Knut=amoney.Knut-pmoney.Knut;
if(nmoney.Knut<0){
amoney.Sickle=amoney.Sickle-1;
nmoney.Knut=nmoney.Knut+29;
}
nmoney.Sickle=amoney.Sickle-pmoney.Sickle;
if(nmoney.Sickle<0){
amoney.Galleon=amoney.Galleon-1;
nmoney.Sickle=nmoney.Sickle+17;
}
nmoney.Galleon=(amoney.Galleon-pmoney.Galleon)*n;
printf("%d.%d.%d",nmoney.Galleon,nmoney.Sickle,nmoney.Knut);
return 0;
}
2、算法笔记
#include<stdio.h>
const int Galleon = 17*29;//1个Galleon兑换17*29个Knut
const int Sickle=29;//1个Sickle兑换29个Knut
int main(){
int a1,b1,c1;
int a2,b2,c2;
scanf("%d.%d.%d %d.%d.%d",&a1,&b1,&c1,&a2,&b2,&c2);
int price=a1*Galleon+b1*Sickle+c1;//价格,兑换成knut单位
int money=a2*Galleon+b2*Sickle+c2;//付款,兑换成knut单位
int change=money-price;//找零的钱
if(change<0){//如果时负数
printf("-");//输出符号
change=-change;//取绝对值
}
//转换成原来的格式
printf("%d.%d.%d\n",change/Galleon,change%Galleon/Sickle,change%Sickle);
return 0;
}