? ? ? ? 已知买了n瓶汽水(3元一瓶),两个空瓶可兑换一瓶汽水,问一共喝了多少瓶汽水?实际花了多少钱?每次用空瓶换汽水,直到手中的剩余空瓶数不够再换一瓶汽水为止。
????????方法一:
假设:
? ? ? ? 1. 买了10瓶汽水,喝完汽水剩10个空瓶,换了5瓶汽水;
? ? ? ? 2. 喝完5瓶汽水,还剩5个空瓶,换了2瓶汽水,还剩下1个空瓶;
? ? ? ? 4. 喝完2瓶汽水,加上剩下的1个空瓶,一共3个空瓶,换1瓶汽水,还剩下1个空瓶;
? ? ? ? 5.?喝完1瓶汽水,加上剩下的1个空瓶,一共2个空瓶,换1瓶汽水;
? ? ? ? 6.?喝完1瓶汽水,剩下1个空瓶,不能继续兑换汽水;
? ? ? ? 一共喝了10+5+2+1+1=19瓶汽水。
? ? ? ? ????????以此类推
思路:
? ? ? ? 1. 首先,计算出兑换前总汽水的数量total;
? ? ? ? 2.?然后,更新手中的空瓶数量empty,其中包括兑换得到的汽水瓶数和剩余的空瓶数;
????????3.?每次将剩余的空瓶数量empty除以2,得到换取的汽水数量,并加到total中;
? ? ? ? 4.?将剩余的空瓶数量empty模2和empty除以2的和的值重新赋给empty,表示剩余的空瓶兑换汽水喝完后剩下的空瓶数量;(注:不要忘记加上上一次兑换汽水喝完后剩下的空瓶数量)
? ? ? ? 5.?重复2和3,直到剩余的空瓶数不能再兑换一瓶汽水。
????????代码实现:?
#include<stdio.h>
int main()
{
int num=0; /*购买汽水数*/
int total = 0; /*总共喝多少瓶汽水*/
int empty=0; /*手里的空瓶数量*/
int sum = 0; /*实际花费*/
printf("输入购买汽水数量:\n");
scanf("%d", &num);
total = num; /*兑换总前汽水瓶数*/
empty = num;
/*重复用手里的空瓶兑换汽水,直到手里的空瓶数小于2个*/
do
{
total += empty / 2;
empty = empty / 2 + empty % 2;
} while (empty >= 2);
//实际花费=num(最初购买汽水数)*3-(total(喝汽水总数)-num(最初购买汽水数))*3
sum = num * 3 - (total - num) * 3;
printf("总共喝了%d瓶汽水,实际花费了%d元\n", total,sum);
return 0;
}
方法二:
? ? ? ?一种简化的实现方式,只考虑没有购买汽水的情况和购买了汽水的情况。
????????我们可以理解为:2个空瓶可以换到1瓶汽水和1个空瓶,相当于1个空瓶可以换1瓶汽水,最后一定会剩余1个空瓶。所以n元可以买n瓶汽水,n瓶汽水相当于n个空瓶,能换n-1瓶汽水。一共可以换2n-1瓶汽水(n>=1)。
????????代码实现:
#include <stdio.h>
int main()
{
int num = 0; /*购买汽水数*/
int total = 0; /*总共喝多少瓶汽水*/
int empty = 0; /*手里的空瓶数量*/
int sum = 0; /*实际花费*/
printf("输入购买汽水数量:\n");
scanf("%d", &num);
//如果没买汽水,则可以喝到0瓶汽?,否则喝到2*n-1瓶汽水
if (num == 0)
{
total = 0;
}
else
{
total = 2 * num - 1;
//实际花费=num(最初购买汽水数)*3-(total(喝汽水总数)-num(最初购买汽水数))*3
sum = num * 3 - (total - num) * 3;
}
printf("总共喝了%d瓶汽水,实际花费了%d元\n", total, sum);
return 0;
}
????????希望这篇文章对大家有所帮助,如果你有任何问题和建议,欢迎在评论区留言,这将对我有很大的帮助。