【PAT乙级】1037 在霍格沃茨找零钱

1037 在霍格沃茨找零钱

分数 20
作者 CHEN, Yue
单位 浙江大学

如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 ——
就如海格告诉哈利的:“十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特(Knut)兑一个西可,很容易。”现在,给定哈利应付的价钱
P 和他实付的钱 A,你的任务是写一个程序来计算他应该被找的零钱。

输入格式:
输入在 1 行中分别给出 P 和 A,格式为 Galleon.Sickle.Knut,其间用 1 个空格分隔。这里 Galleon 是 [0, 10
7
] 区间内的整数,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

题目分析

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;
}
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值