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