【C++&C】1037 在霍格沃茨找零钱 (20 分)

有目录~

C++ 20’/20’

分析:

    把付的钱看做一个对象,各个部分(包括Galleon、Sickle、Knut)都是“钱”的属性。
    因为输入的时候就要求以“Galleon.Sickle.Knut”的格式进行输入,所以立马想到了重载流插入运算符、流提取运算符。
    重载完上述运算符之后再来编写主函数部分就方便多了。
    编写主函数时,遇到了转化的问题(大单位的数字小单位的数字之间的转化),每次遇到这种问题,我都用的是固定的方式:统一将大单位的数字转化为小单位的数字,差值(或求和等其他运算)计算完毕后,再将小单位的数转为大单位的数。
#include <iostream>
using namespace std;

class Money
{
	friend istream& operator>>(istream&, Money&);
	friend ostream& operator<<(ostream&, const Money&);
public:
	int gal;
	int sic;
	int knu;
	int totalToKnut;
};

istream& operator>>(istream& input, Money& m)
{
	input >> m.gal;
	input.ignore();
	input >> m.sic;
	input.ignore();
	input >> m.knu;
	return input;
}

ostream& operator<<(ostream& output, const Money& m)
{
	cout << m.gal << "." << m.sic << "." << m.knu;
	return output;
}

int main()
{
	Money p, a,c; // c:零钱
	
	cin >> p >> a;

	p.totalToKnut = p.gal * 17 * 29 + p.sic * 29 + p.knu;
	a.totalToKnut = a.gal * 17 * 29 + a.sic * 29 + a.knu;

	c.totalToKnut = a.totalToKnut - p.totalToKnut;
	c.gal = c.totalToKnut / 17 / 29;
	c.sic = (c.totalToKnut - c.gal * 17 * 29) / 29;
	c.knu = c.totalToKnut - c.gal * 17 * 29 - c.sic * 29;

	// 防止出现:-3.-2.-1
	c.sic = abs(c.sic);
	c.knu = abs(c.knu);
	
	cout << c;

	return 0;
}

C 20’/20

#include<stdio.h>

typedef struct
{
    int g, s, k;
    int Knut;//turn to Knuts
}PAY;
PAY p, a, changes;

int main()
{
    int t;
    scanf("%d.%d.%d %d.%d.%d", &p.g, &p.s, &p.k, &a.g, &a.s, &a.k);
    p.Knut = p.g * 493 + p.s * 29 + p.k;
    a.Knut = a.g * 493 + a.s * 29 + a.k;
    changes.g = 0;
    changes.s = 0;
    changes.k = 0;
    if (a.Knut == p.Knut)
    {
        printf("0.0.0");
    }
    else
    {
        if (a.Knut < p.Knut)
        {
            printf("-");
            t = a.Knut;
            a.Knut = p.Knut;
            p.Knut = t;
        }
        changes.Knut = a.Knut - p.Knut;
        if (changes.Knut / 493.0 >= 1.0)
        {
            changes.g = changes.Knut / 493;
            changes.Knut = changes.Knut % 493;
        }
        printf("%d.",changes.g);
        if (changes.Knut / 29.0 >= 1.0)
        {
            changes.s = changes.Knut / 29;
            changes.Knut = changes.Knut % 29;
        }
        printf("%d.",changes.s);
        printf("%d",changes.Knut);
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值