/*
喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,
给20元,可以多少汽水。
编程实现。
/
//思路:
//以NULL代表空瓶子;
///1.若先花完钱,再换汽水:
//1元喝1瓶(余1NULL);2元喝2瓶(余1NULL);3元喝3(余1NULL);
//4元喝4瓶(余1NULL) ……19元喝19瓶(余1NULL);20元喝20
//瓶(余1NULL).
//至此钱花完了,有20个空瓶,每2个空瓶可换1瓶汽水,所以20
//个空瓶一共可以换10+5+2+1+1瓶汽水,其中5会余1NULL,与后
//面的2换来的1瓶组合再换一瓶.
//2.边喝边换:
//1元喝1瓶(余1NULL);2元喝3瓶(余1NULL);3元喝5瓶(余1NULL);
//……;19元喝37瓶(余1NULL);20元喝39(余1NULL).观察可得,
//每多花1元可喝的汽水为2n(1<=n<=20)-1,最后剩1个瓶子.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
//输入信息函数
void input_message(int* money, int* exchange_ratio){
printf("请输入您所拥有的钱:\n");
scanf("%d", money); //录入用户的钱
printf("请输入一瓶汽水可用几个空瓶换:\n");
scanf("%d", exchange_ratio); //录入用户输入的兑换比
}
//求喝最多汽水函数
int drink_must_water(int money, int exchange_ratio){
int i;
int sum = 0; //记录可喝的最多汽水数
int empty_bottol = 0; //记录不足以换汽水时的空瓶数
for (i = money; i; i /= exchange_ratio){
sum += i; //sum更新为已喝汽水的累加和
i += empty_bottol; //i加上上一次不足以换汽水剩下的空瓶
empty_bottol = i%exchange_ratio; //本次不足以换汽水的空瓶数
}
return sum;
}
//主函数
int main(){
int money;
int exchange_ratio;
int ret; //接收可喝最多的汽水数
input_message(&money, &exchange_ratio); //调用输入信息函数
ret = drink_must_water(money, exchange_ratio); //接收求喝最多汽水函数的返回值
printf("最多可喝%d瓶汽水\n.", ret);
system("pause");
return 0;
}