c语言递归调用:买啤酒

题目:两元一瓶啤酒,两个啤酒瓶可换一瓶啤酒,四个啤酒瓶盖可换一瓶啤酒,求10元可以买几瓶啤酒。

1、不允许借瓶子、瓶盖:

#include<stdio.h>
//n个瓶,m个瓶盖
int GetCount(int n,int m)
{
	if (n < 2 && m < 4)
	{
		printf("剩余瓶子%d个,瓶盖%d个  ",n,m);
		return n;
	}
	int a = n / 2;
	int b = n % 2;
	int c = m / 4;
	int d = m % 4;
	return n-b + GetCount(a+c+b,a+c+ d);
}

void main()
{
	for(int i=1;i<6;i++)
		printf("%3d元  买%2d瓶啤酒\n",i*2,GetCount(i,i));
}

运行结果:

剩余瓶子1个,瓶盖1个    2元  买 1瓶啤酒
剩余瓶子1个,瓶盖3个    4元  买 3瓶啤酒
剩余瓶子1个,瓶盖3个    6元  买 7瓶啤酒
剩余瓶子1个,瓶盖3个    8元  买11瓶啤酒
剩余瓶子1个,瓶盖3个   10元  买15瓶啤酒
请按任意键继续. . .

2、允许借瓶子、瓶盖,用完即还。

#include<stdio.h>
//n个瓶,m个瓶盖
int GetCount(int n,int m)
{
	if (n < 1 && m < 2)
	{
		printf("剩余瓶子%d个,瓶盖%d个  ",n,m);
		return n;
	}
	int a = n / 2;//2个瓶子换1瓶啤酒
	int b = n % 2;//剩余瓶子
	int c = m / 4;//4个瓶盖换1瓶啤酒
	int d = m % 4;//剩余瓶盖

	if(b==1)//剩1个瓶子时暂借1个瓶子,用后即还
	{
		n++;
		b=0;
		d++;
	}
	if(d==3)//剩3个瓶盖时暂借1个瓶盖,用后即还
	{
		n++;
		b++;
		d=0;
	}
	if(d==2)//剩2个瓶盖,暂借2个瓶盖、1个瓶子,用后即还
	{
		n+=2;
		d=0;
	}
	return n-b + GetCount(a+c+b,a+c+ d);
}

void main()
{
	for(int i=1;i<6;i++)
		printf("%3d元  买%2d瓶啤酒\n",i*2,GetCount(i,i));
}
运行结果:

剩余瓶子0个,瓶盖0个    2元  买 4瓶啤酒
剩余瓶子0个,瓶盖0个    4元  买 8瓶啤酒
剩余瓶子0个,瓶盖0个    6元  买12瓶啤酒
剩余瓶子0个,瓶盖0个    8元  买16瓶啤酒
剩余瓶子0个,瓶盖0个   10元  买20瓶啤酒
请按任意键继续. . .



评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值