题目
喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少汽水?
解析
这个问题是一个典型的递归问题,可以通过计算购买和回收空瓶的过程来解决。让我们逐步分析:
初始购买: 你有20元,每瓶汽水1元,所以最开始你可以买20瓶汽水。
回收空瓶: 喝掉这20瓶汽水后,你有20个空瓶。每2个空瓶可以换一瓶汽水,所以你可以用这些空瓶换10瓶汽水。
继续回收: 喝掉这10瓶汽水后,你又有10个空瓶。同样的规则,你可以换5瓶汽水。
重复过程: 继续这个过程,你每次喝完汽水后回收空瓶以换取更多的汽水。
我们可以一直这样继续下去,直到没有足够的空瓶可以换取更多的汽水。每一步中,你获得的汽水数量等于你拥有的空瓶数量除以2(向下取整)。
现在,让我们来计算一下总共可以喝多少汽水。
给20元,你总共可以喝39瓶汽水。
这个结果是通过不断回收并利用空瓶来换取更多的汽水得出的。初始阶段,你直接购买20瓶汽水。随后,通过回收这些空瓶,你能够逐渐换取更多的汽水,直到没有足够的空瓶可以进行更多的交换为止。
那么该题的算法逻辑梳理出来过后,我们将其写入代码中:
代码跟写
代码语言:javascript复制/*
思路:
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 = %dn", 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 = %dn", total);
return 0;
}