喝汽水问题

                                           前言

今天,我们来解决一个经典的编程问题--喝汽水问题。

喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少汽水。

1.法一:

#include <stdio.h>
int main()
{
	int money = 0;
	int total = 0;
	int empty = 0;

	scanf("%d", &money);
	total = money;
	empty = money;
	while (empty > 1)
	{
		total += empty / 2;
		empty = empty / 2 + empty % 2;
	}

	printf("喝了%d瓶 \n", total);
	return 0;
}

解析:

1. 20元首先可以喝20瓶,此时手中有20个空瓶子
 2. 两个空瓶子可以喝一瓶,喝完之后,空瓶子剩余:empty / 2(两个空瓶子换的喝完后产生的瓶子)+empty % 2(不够换的瓶子)
 3. 如果瓶子个数超过1个,可以继续换,即重复2

2.法二:

这是一个比较妙的解法,通过数学归纳法得出:

按照上述喝水和用瓶子换的规则的话,可以发现,其实就是个等差数列:money*2-1
方法2
int main()
{
	int money = 0;
	int total = 0;
	int empty = 0;


	scanf("%d", &money);
	if (money <= 0)
	{
		total = 0;
	}
	else
	{
		total = money * 2 - 1;
	}
	printf("total = %d\n", total);


	return 0;
}

3.法三:

这个方法是我一开始碰见这题的解题想法,有一定思路,但效率不高。

首先,当我们得知买两瓶送一瓶时,我们会先买两瓶以此得到空瓶来换一瓶。当我们手上有一个空瓶时,只要我们再买一瓶,就能凑成一对来兑换下一瓶,相当于我们用一块钱得到了两瓶汽水,以及下一次兑换的机会。 当我们把钱花光的时候,其实我们刚喝完最后一组汽水,我们还有兑换一瓶的机会所以总数再加一,这瓶就可以留着下次光顾的时候使用了哈哈哈。

int main()
{
	int money;
	int p;
	scanf("%d", &money);
	money -= 2;//先买两瓶,这样能送一瓶
	p = 2;
	while (money)
	{
		p += 2;
		money--;//已有一个空瓶,此时再买一瓶,相当与两瓶一块钱
	}
	printf("%d", p + 1);//最后还剩一瓶加上
	return 0;
}

4.法四:

这是我认为较为简单易懂的方法!!

​
int main()
{
	int s = 20;
	int b = 0;
	while (s)
	{
		b++;
		s--;
		if (b % 2 == 0)
		{
			s++;
		}
	}
	printf("%d\n", b);
}

​

还有钱的时候,我们一瓶一瓶买,那么瓶子是不是一直增加,当瓶子到达2瓶,我们马上兑换,相当于多了一块钱!!

那么瓶子不断增加,当钱消耗完,或者说瓶子再也到达不了2时,打印得数!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值