题目
喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少汽水?
解析
这个问题是一个典型的递归问题,可以通过计算购买和回收空瓶的过程来解决。让我们逐步分析:
初始购买: 你有20元,每瓶汽水1元,所以最开始你可以买20瓶汽水。
回收空瓶: 喝掉这20瓶汽水后,你有20个空瓶。每2个空瓶可以换一瓶汽水,所以你可以用这些空瓶换10瓶汽水。
继续回收: 喝掉这10瓶汽水后,你又有10个空瓶。同样的规则,你可以换5瓶汽水。
重复过程: 继续这个过程,你每次喝完汽水后回收空瓶以换取更多的汽水。
我们可以一直这样继续下去,直到没有足够的空瓶可以换取更多的汽水。每一步中,你获得的汽水数量等于你拥有的空瓶数量除以2(向下取整)。
现在,让我们来计算一下总共可以喝多少汽水。
给20元,你总共可以喝39瓶汽水。
这个结果是通过不断回收并利用空瓶来换取更多的汽水得出的。初始阶段,你直接购买20瓶汽水。随后,通过回收这些空瓶,你能够逐渐换取更多的汽水,直到没有足够的空瓶可以进行更多的交换为止。
那么该题的算法逻辑梳理出来过后,我们将其写入代码中:
代码跟写
/* 思路: 1. 20元首先可以喝20瓶,此时手中有20个空瓶子 2. 两个空瓶子可以喝一瓶,喝完之后,空瓶子剩余:empty/2(两个空瓶子换的喝完后产生的瓶子) + empty%2(不够换的瓶子) 3. 如果瓶子个数超过1个,可以继续换,即重复2 */ int main() { int money = 0; int total = 0; int empty = 0; scanf("%d", &money); //方法1 total = money; empty = money; while(empty>1) { total += empty/2; empty = empty/2+empty%2; } printf("total = %d\n", total); return 0; } // 方法二:按照上述喝水和用瓶子换的规则的话,可以发现,其实就是个等差数列:money*2-1 int main() { int money = 0; int total = 0; int empty = 0; scanf("%d", &money); //方法2 if(money <= 0) { total = 0; } else { total = money*2-1; } printf("total = %d\n", total); return 0; }