问题描述
喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少汽水。
问题分析
假设有5块钱,那么可以买5瓶饮料。所以至少可以和5瓶,至少有5个空瓶子。
5个空瓶子拿出4个换两瓶汽水,剩下1个空瓶。喝完换来的两瓶汽水,这时已经喝了(5+2)瓶汽水,产生的2个空瓶加上是剩余的1个空瓶,一共有3个空瓶。3个空瓶可以换1瓶汽水,剩下1个空瓶,这时共喝了(5+2+1)瓶汽水,产生的1个空瓶加上剩余的1个空瓶,共2个空瓶,正好可以换1瓶汽水,此时一共喝了(5+2+1+1)= 9 瓶汽水。
循环方式解决
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//喝汽水问题
int main()
{
int monny = 0;//一瓶一块钱
int empty = 0;//空瓶数
int total = 0;//总共和的汽水总数
printf("请输入你有多少钱:");
scanf("%d", &monny);
total = monny;//有多少钱就可以买多少瓶
empty = monny;//买了多少瓶就会产生多少个空瓶
while (empty > 1)
{
total = total + empty / 2;//目前喝的汽水总数=已经喝的+空瓶换来的
empty = empty / 2 + empty % 2;//空瓶数=空瓶换来的汽水+剩余的(empty可能为奇数)
}
printf("%d", total);
return 0;
}

基于循环总结规律
下面我们再继续输入几组数据 ,看看规律如何。


5块钱--------9瓶
7块钱--------13瓶
20块钱------39瓶
……
推出:喝的汽水总数= 2 * monny - 1
基于这个规律,我们可用更简单的代码来解决这个问题。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int Count(int monny);
int main()
{
int monny = 0;
printf("请输入你有多少钱:");
scanf("%d", &monny);
int ret = Count(monny);
printf("%d", ret);
return 0;
}
int Count(int monny)
{
return 2 * monny - 1;
}
递归方法解决
基于空瓶数的递归,也就是说,用递归算出空瓶数可以换几瓶汽水,再加上用钱买到的汽水瓶数即可。
基于空瓶数的代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int Count(int empty);
int main()
{
int monny = 0;
printf("请输入你有多少钱:");
scanf("%d", &monny);
int ret = Count(monny);
printf("%d", ret + monny);//注意,需要加上monny
return 0;
}
int Count( int empty)
{
if (empty > 1)//说明可以换汽水
return empty / 2 + Count(empty / 2 + empty % 2);
else
return 0;
}
//empty / 2 --> 用空瓶换来的汽水数
//empty % 2 --> 空瓶数可能为奇数,也就是剩余的空瓶,再加上用空瓶换来的汽水数就得到空瓶数,
//因此,empty/2 + empty % 2 就是空瓶数,作为参数继续调用Count函数,直到空瓶数不足,
//不能再换取汽水

文章介绍了使用循环和递归的方法解决一个关于金钱购买汽水和用空瓶换取汽水的问题,最终得出喝的汽水总数公式。作者通过实例和代码展示了如何用编程实现这一过程。

被折叠的 条评论
为什么被折叠?



