用一般方式:
代码实现
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;
}