【C语言实现】1瓶汽水1元,2个空瓶可以换一瓶汽水,20元可以喝多少汽水呢

一.介绍

1瓶汽水1元,2个空瓶可以换一瓶汽水,20元可以喝多少汽水呢?

今天在网上看到一道有趣的逻辑算数题,仔细一想,这道初级奥数好像可以用我最近学的C语言来实现,随即便写了以下的几种实现方法。

二.具体过程

我思考了两种方法来实现这道题。首先想到的是这个过程相当于一个循环,具体如下。

方法一 循环实现

我们先用20元买了20瓶汽水。当汽水喝完后空瓶子就是20个(k=20)。

第一次,这20个空瓶子就可以换来10瓶汽水(k=20/2=10,s=20%2=0),此时total又增加10了;

第二次,这10瓶汽水喝完又可以换5瓶汽水(k=10/2=5,s=10%2=0);

第三次,5个空瓶子换2瓶汽水(k=5/2=2, s=5%2=1,);

第四次,两个空瓶子换一瓶汽水(k=2/2=1,s=2%2=0);

第五次,最后的一个空瓶子加第三次剩余的那一个空瓶子(s=1),换来1瓶汽水。

代码如下

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int total = 20;  //汽水总数
    int k = 0;     //空瓶数
    int s = 0 ;     //剩余空瓶
       k = 20;
    while(k>=1)
    {
        k= k+s;
        total = total+k/2;//原有的汽水数+换来的汽水数
        s = k%2;
        k=k/2;//两个空瓶子换1个新汽水,汽水喝完就是1个瓶子
    }
    printf("%d\n",total);
    system("pause");
    return 0;
}

方法二 递归实现

第一次和第二次买汽水 ,分别花了一块钱(+2),从第三次开始,每次去花一块钱(money-1)买汽水,再加上用第一次和第二次的空瓶子可以换来一瓶,一共可以获得两瓶汽水(+2),第四次拿着第三次那两空瓶子,再花一块钱(money-1),又可以得到两瓶汽水(+2),第五次,第六次,以此类推,接下来的每一次都是相当于花1元钱和两个空瓶子,来获得两瓶新的汽水。那么到最后一次时,手里已经没有钱了,即此时只有两个空瓶子换来一瓶汽水(+1)。

把去买汽水的过程定义为一个Buy函数就可以递归计算最终结果。

代码如下

#include<stdio.h>
#include<stdlib.h>
int  Buy(int money)
{
    if(money==1)
        return 1;
    else 
        return Buy(money-1)+2;
}
int main()
{
    int money = 20;
    printf("%d\n",Buy(money));
    system("pause");
    return 0;
}

 方法三 if  else语句

我在网上也看到了用if else 语句来实现的,思路也很巧妙。

定义了一个flag作为判断,判断在本次兑换之前的兑换中是否有多余的一个瓶子,方法一中的s变量也有类似的作用。

if选择语句分支中包括判断空瓶的瓶数是偶数还是奇数。

偶数,本次兑换刚好换完。

奇数,且没有多余的空瓶,留下一个空瓶,剩下的全部兑换;如果有多余的空瓶,加上这个空瓶一起兑换。

#include<stdio.h>
#include<windows.h>
int Buy2(int M)
{
    static int flag = 0;
    if (2 * M + flag < 2) 
    {
        return 0;
    }
    if (M % 2 == 0)
    {
        return M + Buysoda(M / 2);
    }
    else if (M % 2 == 1 && flag == 0)
    {
        flag = 1;//表示本次兑换剩下一个瓶盖,提供下次兑换
        return M + Buysoda(M / 2);
    }
    else if (M % 2 == 1 && flag == 1)
    {
        flag = 0;//之前的瓶盖已被用掉
        return M + Buysoda(M / 2  + 1);
    }

}

int main()
{
    int M= 20;
    int total = 0;
    total = Buy2(M);
    printf("一共%d 瓶\n", total);
    system("pause");
    return 0;

}

三.运行结果如下

答案均为39

简单来说,这道题是一个反复循环的有规律的过程。这道题目一定还有很多种不一样的解法,我也只是想到了几个简单的思路,也欢迎大家在评论区交流与指导。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值