C语言初阶习题【22】喝汽水问题

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瓶汽水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瓶汽水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;
}

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值