【C++课程设计】购买到最多的巧克力

题目:

  假设我们可以从自动售货机购买巧克力,一次1美元。每块巧克力都有一个优惠券。我们可以从自动售货机用7张优惠券兑换一块巧克力。我们想知道一点:如果我们有n美元,那么一共能够吃到多少块巧克力,包括优惠券兑换到的巧克力,以及还有多少张富余的优惠券。
  例如,如果我们有20美元,我们最开始用20美元购买20块巧克力。这样一来,我们可以获得20张优惠券。14张优惠券可以兑换2块巧克力。这两块巧克力又含有两张优惠券,所以,再加上最初剩下的6张优惠券,就一共有8张优惠券。这样一来,我们又可以用其中的7张优惠券兑换最后一块巧克力。最后,我们得到23块巧克力和两张富余的优惠券。
  进一步,如果更改了自动售货机兑换一块巧克力所需的优惠券张数,比如由7张改为需要9张才能进行兑换。因此你需要解决这样一个问题,有n美元,m张优惠券兑换一块巧克力。
  针对这个问题写一个递归解决方案,从用户那里接受购买巧克力所花的美元数,然后输出花完这些钱后所得的巧克力块数,并尽量多换优惠券。编写的递归函数将基于所得到的优惠券的数量。

源码:

#include <iostream>
using namespace std;

//巧克力类
class Chocolate {
private:
	double moneyCost;	//消费的美元数
	double ticketCost;	//消费优惠券
	double awardTicket; //每块巧克力奖励多少

public:
	Chocolate(double mCost, double tCost, double award) {
		this->moneyCost = mCost;
		this->ticketCost = tCost;
		this->awardTicket = award;
	}

	double getMoneyCost() {
		return moneyCost;
	}

	double getTicketCost() {
		return ticketCost;
	}

	double getAward() {
		return awardTicket;
	}
};

//客户类
class Custome {
private:
	double money; //拥有美元数
	double ticket; //拥有优惠券数

public:
	Custome(double money, double ticket) {
		this->money = money;
		this->ticket = ticket;
	}

	//用美元购买一次巧克力
	void buyByMoney(Chocolate cho) {
		money -= cho.getMoneyCost();
		ticket += cho.getAward();
	}

	//用优惠券购买一次巧克力
	void buyByTicket(Chocolate cho) {
		ticket = ticket - cho.getTicketCost() + cho.getAward();
	}

	//非费递归算法:获取用户最多可得到的巧克力数
	/*double getMaxChocolate(Chocolate cho) {
		double count = 0;
		while (money >= cho.getMoneyCost())
		{
			buyByMoney(cho);
			count++;
		}
		while (ticket >= cho.getTicketCost())
		{
			buyByTicket(cho);
			count++;
		}
		return count;
	}*/

	//递归算法:获取用户最多可得到的巧克力数
	double getMaxChocolate(Chocolate cho) {
		double count = 0;

		//递归出口
		if (money < cho.getMoneyCost() && ticket < cho.getTicketCost())
			return count;

		if (money >= cho.getMoneyCost()) {
			buyByMoney(cho);
			count++;
		}

		if (ticket >= cho.getTicketCost()) {
			buyByTicket(cho);
			count++;
		}

		return count + getMaxChocolate(cho);
	}
};

int main() {
	double c_dollar, c_ticket, c_award;
	cout << "请分别输入每块巧克力消费的美元或优惠券,以及每块巧克力奖励多少优惠券:" << endl;
	cout << "美元:";
	cin >> c_dollar;
	cout << "优惠券:";
	cin >> c_ticket;
	cout << "奖励优惠券:";
	cin >> c_award;

	Chocolate cho(c_dollar, c_ticket, c_award);	//创建巧克力对象

	double m_dollar, m_ticket;
	cout << "你拥有多少美元或优惠券:" << endl;
	cout << "美元:";
	cin >> m_dollar;
	cout << "优惠券:";
	cin >> m_ticket;

	Custome custome(m_dollar, m_ticket);	//创建用户对象

	if (c_ticket > c_award) {
		double count = custome.getMaxChocolate(cho);
		cout << "你最多可以买到 " << count << " 块巧克力。" << endl;
	}
	else
	{
		cout << "店家送的比卖的还多,你把巧克力店买倒闭了!!!" << endl;
	}
	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nonoas

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值