2021/05/13 1037 在霍格沃茨找零钱 (20 分)

这篇文章介绍了如何使用Python编写一个程序,解决哈利·波特世界里的货币找零问题。给定应付金额和实际支付,程序会计算找零并处理不足的情况。通过结构化输入和比较操作,展示了如何处理Sickle和Knut的进位规则。
摘要由CSDN通过智能技术生成

如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 —— 就如海格告诉哈利的:“十七个银西可(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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值