HNU暑假程序设计训练 0401

目录

题目:

题目关键词提炼:

思路:

代码:


题目:

【问题描述】
如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 —— 就如海格告诉哈利的:“十七个银西可(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

题目关键词提炼:

魔法世界有它自己的货币系统

29 Knut=1 Sickle

17 Sickle=1 Galleo

已知应付的价钱P,实付的钱A,计算应该被找的零钱。

输入:在1行中分别给出P和A,格式为“Galleon.Sickle.Knut”P与A间用1个空格分隔。Galleon是[0,10的七次方]区间内的整数

输出:在一行中用与输入同样的格式输出哈利应该被找的零钱。

如果他没带够钱,那么输出的应该是负数。

思路:

思路1:类似于算法笔记P91的“日期差值”,不过更简单。不妨假设A>P。令P的钱数不断加一个knut,直到A=P为止(遇到knut=29或者sickle=17了就要进位)。若实际上A<P,则将A同P的值交换。需要注意的是,Galloen可以达到10的七次方,如果数据是0.0.1 10000001.11.26这样的就会超时。因此可以先直接减法计算出应找零钱的galleon数。

思路2:将P和A都转换为knut,计算差值,然后把结果转换为Galleon.Sickle.Knut的形式。

代码:

思路1代码:

#include <iostream>
#include<stdio.h>
using namespace std;
int AIsBigger(int p1,int p2,int p3,int a1,int a2,int a3);
int main()
{
   int pKnut,pSickle,pGalleon,aKnut,aSickle,aGalleon;
   scanf("%d.%d.%d %d.%d.%d",&pGalleon,&pSickle,&pKnut,&aGalleon,&aSickle,&aKnut);
   bool A_Bigger=true;
   if(!AIsBigger(pKnut,pSickle,pGalleon,aKnut,aSickle,aGalleon))
   {//交换,使得A总是大的那个
       A_Bigger=false;
       int t;
       t=aKnut;
       aKnut=pKnut;
       pKnut=t;
       t=aSickle;
       aSickle=pSickle;
       pSickle=t;
       t=aGalleon;
       aGalleon=pGalleon;
       pGalleon=t;
   }
       int tKnut=0,tSickle=0,tGalleon=0;//用于记录应找的零钱。
       tGalleon=aGalleon-pGalleon-1;
       pGalleon=aGalleon-1;
       while(!((pKnut==aKnut) && (pSickle==aSickle) && (pGalleon==aGalleon)))
       {
           pKnut++;
           tKnut++;
           if(pKnut==29)
           {
               pKnut=0;
               pSickle++;

           }
           if(pSickle==17)
           {
               pSickle=0;
               pGalleon++;

           }
           if(tKnut==29)
           {
               tKnut=0;
               tSickle++;
           }
           if(tSickle==17)
           {
               tSickle=0;
               tGalleon++;
           }
       }
       if(A_Bigger)
        {
           printf("%d.%d.%d",tGalleon,tSickle,tKnut);
        }
        else
        {//付的钱不够的情况:
            printf("-%d.%d.%d",tGalleon,tSickle,tKnut);
        }
}

int AIsBigger(int p1,int p2,int p3,int a1,int a2,int a3)
{
    if(p3!=a3)
    {
        return a3>p3;
    }
    else if(p2!=a2)
    {
        return a2>p2;
    }
    else
    {
        return a1>p1;
    }
}

思路2代码:

https://blog.csdn.net/ww1473345713/article/details/51992901

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值