B1037. 在霍格沃茨找零钱(20)

题目描述:

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

思路:

将P和A全部转化为Knut之后进行运算,在对结果进行除基取余求出所要答案;

代码如下:

#include <cstdio>

struct money {
	int gelleon;
	int sickle;
	int knut;	
}p, a;

int main()
{
	scanf ("%d.%d.%d", &p.gelleon, &p.sickle, &p.knut);
	scanf ("%d.%d.%d", &a.gelleon, &a.sickle, &a.knut);
	int price1, price2;
	price1 = p.gelleon * 29 * 17 + p.sickle * 29 + p.knut;            //转化为Knut进行计算;
	price2 = a.gelleon * 29 * 17 + a.sickle * 29 + a.knut;
	
	int ans = price2 - price1;
	if (ans < 0) {					//判断是否需要输出负号,和对结果进行修正; 
		printf ("-");
		ans = -ans;								
	}
	
	printf ("%d.%d.%d\n", ans / (29 * 17), ans % (29 * 17) / 29, ans % 29);
	
 	return 0;
} 

再给出另一种思路:

P和A的加减从低位开始,不够减时向前一位借位(需考虑前一位为0的情况)。

扫描二维码关注公众号,回复: 5785225 查看本文章

代码如下:(相比之下过于繁琐,只用于参考思路

#include <cstdio>

struct money {
	int gelleon;
	int sickle;
	int knut;	
}p, a, change;

bool more(money a, money b) {				//判断P和A的大小; 
	if (a.gelleon != b.gelleon)		return a.gelleon > b.gelleon;
	if (a.sickle != b.sickle)  		return a.sickle > b.sickle;
	return  	a.knut > b.knut;
}

void swap (money *a, money *b) {			//用于交换P、A; 
	struct money temp;
	temp = *a;
	*a = *b;
	*b = temp;
}

int main()
{
	scanf ("%d.%d.%d", &p.gelleon, &p.sickle, &p.knut);
	scanf ("%d.%d.%d", &a.gelleon, &a.sickle, &a.knut);
	
	if (more (p, a) != 0) {				
		swap (&p, &a);
		printf ("-");
	}
	if (a.knut >= p.knut)		change.knut = a.knut - p.knut;
	else {
		change.knut = a.knut + 29 - p.knut;				
		if (a.sickle !=0)       a.sickle--;				//向sickle借位; 
		else {								//sickle为0时,再向gelleon借位; 
			a.sickle = a.sickle + 17 - 1;
			a.gelleon--;		
		}
	}
	
	if (a.sickle >= p.sickle)		change.sickle = a.sickle - p.sickle;
	else {
		change.sickle = a.sickle + 17 - p.sickle;
		a.gelleon--;
	}
	
	change.gelleon = a.gelleon - p.gelleon;
	
	printf ("%d.%d.%d\n", change.gelleon, change.sickle, change.knut);
	
 	return 0;
}

猜你喜欢

转载自blog.csdn.net/privilage/article/details/79948626