【C语言刷题系列】喝汽水问题

文章目录

一、文章简介

1.先买再换

1.1 代码逻辑:

1.2 完整代码

1.3 运行结果

1.4 根据方法一总结优化

2.边买边换

2.1 代码逻辑:

2.2 完整代码

2.3 运行结果


一、文章简介

本文所述专栏——C语言经典编程问题 C语言刷题_倔强的石头106的博客-CSDN博客

喝汽水问题是一个经典的编程问题

在这个问题中,你初始有n元钱,每瓶汽水1元。并且喝完汽水之后,每2个空瓶子可以换一瓶汽水。求可以喝到多少瓶汽水。

 解决此问题所需的C语言知识储备【C语言基础篇】结构控制(中)循环结构-CSDN博客

本篇文章介绍两种解题思路及过程

1.先买再换

先用初始的n元去买n瓶汽水,这时也拥有了n个空瓶。n个空瓶再去换n/2瓶汽水,这时现有的空瓶数量为 n/2 + n%2 (n%2表示不够换一瓶的数量,可能为1或0),再用现有的空瓶去换汽水直到空瓶数不够换一瓶汽水为止(小于2)。

1.1 代码逻辑:

放到编程中来讲:

① 首先创建变量n,读入初始金额n

②接着创建变量total用于记录可喝汽水数量,初始应该等于金额n

       创建变量empty用于记录当前空瓶子数量,初始也应该等于金额n

③然后进入while循环,循环的条件是空瓶子数量>1,

        循环内部,每一次循环完成——

                空瓶子数量empty除2,等于本次换到的汽水数量,计入喝汽水总量

                换汽水完成之后,本轮空瓶子数量= 空瓶子数量/2+空瓶子数量%2

当循环结束之后,得到的total就是可以喝的汽水总数

1.2 完整代码
//喝汽水问题
//方法一
#include<stdio.h>

int main()
{
	int money = 0;
	scanf("%d", &money);//输入可用金额

	int total = money;//初始可喝汽水数量
	int empty = money;//初始空瓶子数量

	while (empty > 1)
	{
		total = total + empty / 2;
		empty = empty / 2 + empty % 2;
	}

	printf("可以喝%d瓶\n", total);
	return 0;
}
1.3 运行结果

1.4 根据方法一总结优化

如果将程序多运行几次

观察结果,我们就会发现,初始金额n与可喝汽水数量total之间存在着一定规律

n=5,total=9

n=6,total=11

n=7,total=13

n=8,total=15

没错,total=2*n-1

如果在1元买一瓶,两空瓶换一瓶的基础条件下,可以根据上述规律将代码修改

int main()
{
	int money = 0;
	scanf("%d", &money);

	int total = 0;
	if (money > 0)
		total = 2 * money - 1;

	printf("可以喝%d瓶\n", total);
	return 0;
}

2.边买边换

第二种解题思路是:

得到初始的金钱n后,优先用空瓶子去换汽水当空瓶子不够时,再花钱买一瓶重复上面的过程,直到没钱,以及空瓶子小于2

2.1 代码逻辑:

放到编程中来讲:

① 首先创建变量n,读入初始金额n

②接着创建变量total用于记录可喝汽水数量,初始等于0

       创建变量empty用于记录当前空瓶子数量,初始等于0

③然后进入while循环,循环的条件是金钱>0,或者空瓶>=2

        循环内部,每一次循环完成判断——

               先判断如果空瓶子>=2,可喝汽水数量+1,空瓶子-2

                如果空瓶子不够换,可喝汽水数量+1,金钱-1

当循环结束之后,得到的total就是可以喝的汽水总数

2.2 完整代码
//方法二
#include<stdio.h>
int main()
{
	int money = 0;
	scanf("%d", &money);

	int total = 0;
	int empty = 0;

	while ((money > 0)||(empty>=2))
	{
		if (empty >= 2)//有空瓶时用瓶换
		{
			total++;
			empty-=2;
		}
		else           //没空瓶时用钱买
		{
			total++;
			money--;
		}
		empty++;  //得到一瓶时空瓶+1
	}
	printf("可以喝%d瓶\n", total);
	return 0;
}
2.3 运行结果

使用方法二和方法一的效果相同

创作不易,还望点赞支持。如有错误,还望提醒更正。

  • 61
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值