C语言- 喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水?

来源:互联网 发布:网络打鱼刷分教程 编辑:程序博客网 时间:2024/04/28 22:21

喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水。编程实现。


整体思路:用递归的方式实现,每一次递归表示本次可以购买汽水的瓶数(M)。首先判断M是否是能够全部兑换完(M为偶数),分两种情况:

如果可以(M为偶数),再次进行 M/2 的递归,表示本次M个瓶子兑换 M/2 个汽水;

如果不可以(M为奇数),在这里我们进行一个判断(flag:看在本次兑换之前的兑换中是否有多余的一个空瓶子,初值为0),如果flag为0(没有多余的),那么本次兑换留下一个空瓶子,即flag=1(本次留下一个不进行兑换),以供下次兑换使用;如果flag为1,那么本次兑换,加上这个瓶子,进行兑换,即flag=0,表示之前留下的空瓶子已被用掉。

直到 2*M + flag 小于2,不能再兑换为止。


代码实现(Visual Studio 2017)

//喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水。编程实现。#include<stdio.h>#include<windows.h>int Buysoda(int M){    static int flag = 0;//flag作为一个判断,看在本次兑换之前的兑换中是否有多余的一个瓶盖    if (2 * M + flag < 2) //判断能否购买汽水    {        return 0;    }    if (M % 2 == 0)//M瓶汽水的瓶盖是偶数,本次兑换刚好换完    {        return M + Buysoda(M / 2);    }    else if (M % 2 == 1 && flag == 0)//M瓶汽水的瓶盖是奇数,且没有多余的瓶盖,留下一个瓶盖,剩下的全部兑换    {        flag = 1;//表示本次兑换剩下一个瓶盖,提供下次兑换        return M + Buysoda(M / 2);    }    else if (M % 2 == 1 && flag == 1)//M瓶汽水的瓶盖是奇数,且有多余的瓶盖,加上这个瓶盖一起兑换    {        flag = 0;//之前的瓶盖已被用掉        return M + Buysoda(M / 2  + 1);    }}int main(){    int money = 20;    int num = 0;    num = Buysoda(money);    printf("可以买 %d 瓶汽水\n", num);    system("pause");    return 0;}
阅读全文
0 0