如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 —— 就如海格告诉哈利的:“十七个银西可(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
本题思路:
抓住它这里面的附加条件:Sickle 是 [0, 17) 区间内的整数,Knut 是 [0, 29) 区间内的整数。
表明这两个不会超过它们的进率范围
先写出带够钱的算法
如果没带够钱,直接输出前面加个负号就行了
#include<stdio.h>
#define Sickle_Galleon 17 //西可换加隆进率
#define Knut_Sickle 29 //纳特换西克进率
#include<math.h>
//这里用了结构
struct money{
int Sickle,Galleon,Knut;
};
int bigger(struct money a,struct money b) //算出它们哪个钱比较多
{
long int x1,x2;
x1=a.Galleon*17*29+a.Knut+a.Sickle*29;
x2=b.Galleon*19*29+b.Knut+b.Sickle*29;
if(x1>=x2)
return 1;
else
return 0;
}
int main()
{
struct money p,a,t,temp; //p为应付,a为实际所付
scanf("%d.%d.%d",&p.Galleon,&p.Sickle,&p.Knut);
scanf("%d.%d.%d",&a.Galleon,&a.Sickle,&a.Knut);
if(a.Galleon>=p.Galleon&&a.Knut>=p.Knut&&a.Sickle>=p.Sickle) //如果实际付的每一项都比它大 直接减去
{
t.Galleon=a.Galleon-p.Galleon;
t.Knut=a.Knut-p.Knut;
t.Sickle=a.Sickle-p.Sickle;
printf("%d.%d.%d",t.Galleon,t.Sickle,t.Knut);
return 0; //直接return即可
}
if(bigger(a,p)) //实际付的比较多
{
if(a.Knut<p.Knut)
{
a.Sickle-=1;a.Knut+=Knut_Sickle;
}
if(a.Sickle<p.Sickle)
{
a.Galleon-=1;a.Sickle+=Sickle_Galleon;
}
t.Knut=a.Knut-p.Knut;
t.Sickle=a.Sickle-p.Sickle;
t.Galleon=a.Galleon-p.Galleon;
printf("%d.%d.%d",t.Galleon,t.Sickle,t.Knut);
}
else //这一段代码与上面是完全一样的 只是输出加了个负号
{
temp=a;a=p;p=temp; //交换一下
if(a.Knut<p.Knut)
{
a.Sickle-=1;a.Knut+=Knut_Sickle;
}
if(a.Sickle<p.Sickle)
{
a.Galleon-=1;a.Sickle+=Sickle_Galleon;
}
t.Knut=a.Knut-p.Knut;
t.Sickle=a.Sickle-p.Sickle;
t.Galleon=a.Galleon-p.Galleon;
printf("-%d.%d.%d",t.Galleon,t.Sickle,t.Knut);
}
return 0;
}