超详细的代码实现喝汽水

【喝汽水游戏,一元一瓶汽水,2个空瓶子换一瓶汽水,给你一些钱,你能喝几瓶】

给你20元,一元能换一瓶汽水,2个空瓶子能换1瓶汽水,20元你能喝几瓶?【答案39】

我们先来分析问题

首先,我们先干一票大的:用全身家当20元巨款,换20瓶快乐水

 你一口气干掉了20瓶快乐水【此时肚子里装了20瓶快乐水

你得到了20个宝贵的空瓶子

 你喝上头,于是又把它们换成了10瓶快乐水

 咕噜咕噜,你把他们又干掉了【肚子里装了30瓶快乐水

 

 喝完又换了5瓶快乐水

 又干掉了【肚子里装了35瓶快乐水

 又跑去换成了2瓶快乐水,但是你发现上次的空瓶子留下了一个【快看它快看它】

 

 咕噜咕噜又干掉了2瓶【喝了37瓶

加上次的空瓶子,现在你有3个空瓶子

 又把其中2个空瓶子换成了1瓶快乐水,发现多出了一个空瓶

 又干掉了这瓶【肚子里装了38瓶快乐水

 你发现上次多出的空瓶,加现在的刚好又能喝一瓶

果断干掉它,喝了39瓶

【于是你20元喝了39瓶汽水

 最后留下来一个空瓶子

【小声:现实中你甚至可以借老板一个瓶子,换成汽水喝完,还老板空瓶子】

…………………………………………我是快乐的分割线……………………………………………… 


代码的实现

实现代码的时候,我们要通过分析问题,把一个大的的问题,拆成多个小的问题,一步一步实现这些小的问题

我们先很形象的定义一些量

#include<stdio.h>

int main() {

	int money = 0;//钱
	scanf("%d", &money);
	int sum = 0;//喝进肚子里的汽水量
	int q = money;//有多少瓶汽水可以喝
	int k = 0;//空瓶子数量


	return 0;
}

我们先来一轮

把现在汽水喝进肚子里,剩下的瓶子换成汽水

#include<stdio.h>

int main() {

	int money = 0;//钱
	scanf("%d", &money);
	int sum = 0;//喝进肚子里的汽水量
	int q = money;//有多少瓶汽水可以喝
	int k = 0;//空瓶子数量

    sum += q;//把手上的汽水装到肚子里
    k = q;//汽水喝完剩下的空瓶子
    q=k/2 ;//把空瓶子换成汽水   

	return 0;
}

我们需要喝多次,肯定有循环套起来:

#include<stdio.h>

int main() {

	int money = 0;//钱
	scanf("%d", &money);
	int sum = 0;//喝进肚子里的汽水量
	int q = money;//有多少瓶汽水可以喝
	int k = 0;//空瓶子数量

	while (k!=1) {//当手上的空瓶子=1个时,换不了了,条件假
		sum += q;//把手上的汽水装到肚子里
		k = q;//汽水喝完剩下的空瓶子
		q = k / 2;//把空瓶子换成汽水
	}
	printf("%d", sum);

	return 0;
}

但真就这样了吗?走你

 显然不对,问题出在了哪里呢?

没错,就是多出来的那个空瓶子!并没有传递给下一次循环

解决:我们可以对每一次循环都判断一下,上一次空瓶子数是多少个,如果是奇数个,说明这次循环必定会继承上一次的一个空瓶子【+1】,否则不继承【+0】

实现:

完整代码

#include<stdio.h>

int main() {

	int money = 0;//钱
	scanf("%d", &money);
	int sum = 0;//喝进肚子里的汽水量
	int q = money;//有多少瓶汽水可以喝
	int k = 0;//空瓶子数量

	while (k != 1) {
		sum += q;//把手上的汽水装到肚子里
		k = q + k % 2;//汽水喝完剩下的空瓶子【k%2,奇数余1,偶数余0】
		q = k / 2;
	}
	printf("%d", sum);

	return 0;
}

或者:

常见的写法

我们还可以先喝,拿到空瓶子

#include<stdio.h>

int main() {

	int money = 0;//钱
	scanf("%d", &money);
	int k=money;//喝了多少瓶
	int q = k;//空瓶子数
	while (k>1) {//空瓶子大于1
		q += k / 2;//第二次喝,20空瓶子换成汽水,20+10=30
		k = k/2+k%2;//喝完空瓶子数,20/2=10
	}
	printf("%d", q);

	return 0;
}

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡涂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值