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

用一般方式:

代码实现

int main()
{
    int total = 0;
    int kps = 0;
    int ys = 0;
    printf("请输入钱数:");
    scanf("%d", &total); 
    kps = total;
    while (kps >= 1)
    {
        kps += ys;
        total += kps / 2;
        ys = kps % 2;
        kps /= 2;
    }
    printf("能换取 %d 瓶汽水\n", total);
    system("pause");
    return 0;
}

方法2:用递归的方式实现
思路:

  • 每一次递归表示本次可以购买汽水的瓶数(n)
  • 判断n是否是能够全部兑换完 (n为偶数),分两种情况:

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

    • 如果不可以(n为奇数),在这里我们进行一个判断(flag:看在本次兑换之前的兑换中是否有多余的一个空瓶子,初值为0)

      • 如果flag为0(没有多余的),那么本次兑换留下一个空瓶子,即flag=1(本次留下一个不进行兑换),以供下次兑换使用;
      • 如果flag为1,那么本次兑换,加上这个瓶子,进行兑换,即flag=0,表示之前留下的空瓶子已被用掉。
  • 直到 2*n + flag < 2,不能再兑换为止。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
int buy_soda(int n)
{
    static int flag = 0;//定义静态变量flag
    //(兑换后剩余的空瓶数),保证递归后不会销毁数据。
    if (2 * n + flag < 2)//判断本次能否至少购买一瓶汽水
        return 0;
    if (n % 2 == 0)//偶数瓶瓶盖,全部兑换
        return n + buy_soda(n / 2);
    else if (n % 2 == 1 && flag == 0)//奇数瓶瓶盖,
    //且没有上次兑换的多余的剩瓶盖,则留下一个瓶盖,
    //剩下的全部兑换
    {
        flag = 1;
        return n + buy_soda(n / 2);
    }
    else if (n % 2 == 1 && flag == 1)//奇数瓶瓶盖,
    //且有上次兑换的多余剩的瓶盖,加上这个瓶盖一起兑换
    {
        flag = 0; //将之前剩余的空瓶用掉
        return n + buy_soda(n / 2 + 1);
    }
    return 0;
}
int main()
{
    int money = 0;
    printf("money=");
    scanf("%d", &money);
    printf("可以买 %d 瓶汽水\n", buy_soda(money));
    system("pause");
    return 0;
}


猜你喜欢

转载自blog.csdn.net/sifanchao/article/details/80040422