【问题描述】
喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少汽水(编程实现)。
【解题思路】
变量解释:money总金额数,price汽水单价,exchange几个空瓶可以换一瓶汽水。
total可以喝到的总瓶数,newbottle由空瓶子交换后的新的汽水,empty空瓶数。
- 有money元钱,一共可以喝到total (total = money / price)瓶汽水。
- 喝完后剩余empty (empty = total)个空瓶子。
- 可以兑换newbottle(newbbottle = empty / exchange)瓶新的汽水,剩余( empty%exchange)个空瓶子,不足兑换一瓶新的汽水。
- 新兑换的汽水喝完后又会有(newbottle)个空瓶子剩余, 所以目前剩余空瓶子为:empty(empty = newbobttle + empty%exchange)个空瓶子。
- 以此循环,直到剩余的瓶子(empty%exchange)不足以兑换一瓶新的汽水结束。
【本题中】
- 20元钱,可以喝到20瓶水,
- 剩余20个空瓶子,可以兑换20/2 = 10瓶汽水,兑换之后剩余20%2 = 0个空瓶子。这时一共可以喝到:20+10 = 30瓶水。
- 剩余空瓶子
10 + 0 = 10个
,可以兑换10/2=5瓶水,兑换之后剩余10%2 = 0个空瓶子。这时一共可以喝到:30+5 = 35瓶水。 - 剩余空瓶子5 + 0 = 5个,可以兑换5/2=2瓶水,兑换之后剩余5%2 = 1个空瓶子。这时一共可以喝到:35+2 = 37瓶水。
- 剩余空瓶子2 + 1 = 3个,可以兑换3/2=1瓶水,兑换之后剩余3%2 = 1个空瓶子。这时一共可以喝到:37+1 = 38瓶水。
- 剩余空瓶子1 + 1 = 2个,可以兑换2/2=1瓶水,兑换之后剩余2%2 = 0个空瓶子。这时一共可以喝到:38+1 = 39瓶水。
- 此时剩余空瓶子1+0=1个,不足以兑换一瓶新汽水,循环结束。一共可以喝到39瓶汽水。
注意:剩余空瓶子为:上次兑换的新的汽水喝完后留下的空瓶子+兑换之后剩余不足以兑换新汽水的空瓶子。例如:(有红色字体标注),20个空瓶子兑换的10瓶水喝完后留下的空瓶子+兑换之后剩余的0空瓶子,所以10+0 = 10个空瓶子。
【代码】
本代码实现了不定金额数,不定汽水单价,不定几个空瓶可以兑换一瓶汽水的情况。代码的适应性较强。
#include <stdio.h>
int main()
{
int money = 0;
printf("请输入你有多少钱:");
scanf("%d", &money);
int price = 0; //价格
printf("请输入汽水的单价:");
scanf("%d", &price);
int exchange = 0;//两个空瓶换一瓶水
printf("请输入多少个空瓶子可以换一瓶水:");
scanf("%d", &exchange);
int total = money / price;//可以喝到的总瓶数
int newbottle = 0; //换后的新的瓶装水
int empty = total;//空瓶数
while (empty != (empty % exchange))
{
newbottle = empty / exchange; //转换
total += newbottle; //总的瓶装水
empty = newbottle + empty % exchange;//剩余的空瓶子
}
printf("你一共可以喝到:%d瓶水。\n", total);
return 0;
}
【结果】
Ending~:
注意理解循环体循环的终止条件,当可以兑换时,循环继续,不足以兑换时,退出循环。