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

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

一、文章简介

本文所述专栏——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 运行结果

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

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

相关文章
|
5天前
|
C语言
【C语言刷题系列】合并两个有序数组
【C语言刷题系列】合并两个有序数组
|
5天前
|
C语言
【C语言刷题系列】删除公共元素
【C语言刷题系列】删除公共元素
|
5天前
|
存储 C语言
【C语言刷题系列】对数字添加逗号
【C语言刷题系列】对数字添加逗号
|
4天前
|
C语言
C语言刷题(函数)
C语言刷题(函数)
|
4天前
|
C语言
C语言刷题(数组)
C语言刷题(数组)
|
5天前
|
存储 C语言
【C语言刷题系列】求一个数组中两个元素a和b的和最接近整数m
【C语言刷题系列】求一个数组中两个元素a和b的和最接近整数m
|
4天前
|
C语言
C语言刷题(循环结构程序设计)
C语言刷题(循环结构程序设计)
|
5天前
|
存储 算法 C语言
【C语言刷题系列】消失的数字
【C语言刷题系列】消失的数字
|
5天前
|
C语言
【C语言刷题系列】轮转数组
【C语言刷题系列】轮转数组
|
5天前
|
C语言
【C语言刷题系列】移除元素
【C语言刷题系列】移除元素