题目要求
一道小学的数学题,但使用编程解决依旧很有趣
1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少汽水
思路
1、20/1=20
2、20/2=10
3、10/2=5
4、5/2=2 多一个瓶盖
5、 2/2=1 多一个瓶盖 两个瓶盖又刚好换一瓶
所以一共是20+10+5+2+1+1=39瓶
20元是刚刚好换完的情况,那30元呢?
按照上诉步骤
1、30/1=30
2、30/2=15
3、15/2=7 多一个瓶盖
4、(7+1)/2 =4
5、 4/2=2
6、2/2=1 多一个瓶盖
多出一个瓶盖换不了
也就是30+15+7+4+2+1=59瓶
一般答案也就是59瓶,这个时候博主想到了小学六年级讲的这题,当时也是多了一个瓶盖,很多同学也就只算到这里为止,但是我们老师说还能多来一瓶,就是借别人一瓶如何换一瓶喝了把瓶盖还给人家
实现代码
#define _CRT_SECURE_NO_WARNINGS 1
//喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少汽水
#include<stdio.h>
#define RMB 30
int Caps(int caps,int water) {
if (caps < 2) {
return water + 1;
}
else {
water = caps / 2 + water;
return Caps(caps % 2 + caps / 2, water);
}
}
int main() {
int rmb = RMB;
int water = 0;
int caps = 0;
water = rmb / 1;
caps = water;
water = Caps(caps,water);
printf("%d", water);
return 0;
}
要点分析
这里我们采用递归的方式简化代码
if (caps < 2) {
return water + 1;
}
这里我们就判断只剩一个瓶盖的时候,然后进行借还操作,本质也就是个数加一
else {
water = caps / 2 + water;
return Caps(caps % 2 + caps / 2, water);
}
如果瓶盖数大于1,我们就自己去换饮料喝,然后开始递归Caps函数,进行后续的重复操作,water在这里重复使用相加,使得递归结束时候的water是最后结果
需要注意的是有时候会在自己换饮料的过程中出现多一个瓶盖的情况,例如15/2=7,多一个瓶盖,在接下来进入函数的时候需要注意加上这个多的瓶盖
这里博主就绕进去了,想的是用if去判断然后加进去,这样应该是可以实现的(但是博主没调出来),博主犯的错误就是使得caps越加越大,无法结束递归,出现了逻辑问题。后面博主冷静了一下,理清了思绪,发现可以直接在传参上解决这个问题:
如果多一个就意味着取余为1,加上caps%2就行了,如果不多,那取余为0,加上也不影响
Caps(caps % 2 + caps / 2, water)
结束语
这段时间的更新很慢,因为我们C语言的学习马上就进入指针部分了,指针可以说是C语言的灵魂,但也是C语言学习中的第一道大坎,不迈过去的话C语言的学习极大可能夭折,所以博主这段时间一直在消化整理指针的内容,希望可以有一个很好的状态去讲述这个知识,敬请期待!