1.喝汽水问题
喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少汽水(编程实现)
2. 思路
我们创建付钱的钱数money
单瓶汽水的价格price
瓶子bottle
汽水drink
money/price就是第一次买到的汽水,先赋值给我们的汽水
然后2个瓶子换一个汽水,所以只要瓶子大于2,我们就要进行兑换一开始我直接粗暴的除以了2,后面发现这样是有问题的,到5的时候,5/2 = 2,但是剩下的3瓶子也能兑换一瓶汽水,所以我们需要把5%2的值也加上。
3. 代码实现
- 错误代码
//喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少汽水(编程实现)
#include<stdio.h>
int main()
{
int money = 0;
scanf("%d", &money); //20
int price = 1;
int bottle = 0;
int drink = 0;
bottle = money / price;//20
drink = bottle;
while (bottle > 2)
{
drink += bottle / 2;
bottle = bottle / 2;
}
printf("%d", drink);
return 0;
}

这里发现bug了,我们20元,其实能兑换的是39瓶汽水,这里只打印了37少了2瓶,研究下是哪里少了
按照我现在的这个逻辑,调试发现 第一个小错误是bottle应该是>=2 ,2的时候也要进去呢,第二个错误是少算了。进入调试:

5/2 = 2 ,剩下的3瓶也能兑换1瓶汽水呢,那说明我们的循环体内这样的计算方式有缺陷,我们需要加上我们的余数大于2的,更改后

- 正确代码
//喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少汽水(编程实现)
#include<stdio.h>
int main()
{
int money = 0;
scanf("%d", &money); //20
int price = 1;
int bottle = 0;
int drink = 0;
bottle = money / price;
drink = bottle;//drink = 20
while (bottle >= 2)
{
drink += bottle / 2; //第一次循环 drink =20+10 = 30 第二次循环 drink = 30+5 = 35 第三次循环 drink =35+2 = 37 第四次循环 drink = 37+1 = 38 第五次循环 drink =38+1=39
bottle = bottle / 2+ bottle %2; //第一次循环 bottle=10, 第二次循环 bottle = 5 第三次循环 bottle = 3 第四次循环 bottle = 2 第五次循环 bottle =1
}
printf("%d", drink); //所以这里打印的是39
return 0;
}
4.代码实现2
这里有更简便的算法。只要money大于0,我们就根据公式2*money-1就直接算出我们的结果了。
//喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少汽水(编程实现)
#include<stdio.h>
int main()
{
int money = 0;
scanf("%d", &money); //20
int price = 1;
int bottle = 0;
int drink = 0;
bottle = money / price;
drink = bottle;//drink = 20
//while (bottle >= 2)
//{
// drink += bottle / 2; //第一次循环 drink =20+10 = 30 第二次循环 drink = 30+5 = 35 第三次循环 drink =35+2 = 37 第四次循环 drink = 37+1 = 38 第五次循环 drink =38+1=39
// bottle = bottle / 2+ bottle %2; //第一次循环 bottle=10, 第二次循环 bottle = 5 第三次循环 bottle = 3 第四次循环 bottle = 2 第五次循环 bottle =1
//
//}
if (money > 0)
drink = 2 * money - 1;
printf("%d", drink);
return 0;
}


被折叠的 条评论
为什么被折叠?



