问题概述:喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少汽水
刚开始思考问题的时候不难想到用20元买了汽水之后,就会有20个空瓶子。之后用20/2=10可以换取10瓶新的汽水,之后10/2=5可以换取5瓶新的汽水,同理5/2=2(此处数据均为整型类型,故虽然从数学意义角度想5/2=2.5,但是会被强行转换成整型数据即2)可以换取2瓶汽水,并且剩下1瓶空瓶子,2/2=1可以换取一瓶新的汽水,那么将开始买的20瓶汽水加上之后新买的10+5+2+1得出38瓶。
但是真的是这样吗?我其实遗漏了一个点,在有5个空瓶子的时候我用4个空瓶子换取了2瓶汽水,还剩下一个空瓶子没有用到呢。这个没有用到的空瓶子其实是有用的,和之后换来的2瓶加在一起就是3个空瓶子了,那么这时候可以换取1个新的,最后空瓶子剩下两个,又可以换取一个新的瓶子,所以上述表明,在计算最终可以换取多少汽水时我在计算空瓶子总数量的时候忘记了空瓶子是一直累加的。所以经过上面的分析,我们就可以写出以下的代码
#include<stdio.h>
int main()
{
int money=0;//刚开始拿多少钱去买汽水
scanf("%d",&money);
int empty=money;//记每一次空瓶子总数量为empty,刚开始全部的钱都买了汽水,所以就有money个空瓶子
int total=money;//记喝的汽水瓶子总数为total
while(empty>1)//循环的条件是当空瓶子数量大于1时,还可以进行兑换
{
total+=empty/2;
empty=empty/2+empty%2;//这一步尤为关键!
}
printf("%d",total);
return 0;
}
写完之后,我们可以使money取不同的值,最后可以发现total的值是一个首项为1,公差为2的等差数列,比如money是20的话,那么就是求该数列的第二十项是多少。运用中学学的知识,我们可以用2*money-1来表示每一项该是多少。