前言
今天,我们来解决一个经典的编程问题--喝汽水问题。
喝汽水,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时,打印得数!