20块钱喝汽水数量最大化问题

       对于生活中这种问题的解决实际是很有意思的,这个问题是不难得到答案的,只要你多动手算一下就出来了,多算几次就可以发现其中存在的规律,这样代码就好敲了。

针对这个问题,我们先来看看,对于下面这个方法我考虑得过于理想,我的代码算出来是可以喝40瓶,但是现实是你只能喝39瓶,因为你总是会剩余最后一个瓶子,但你无法向老板提前透支一瓶来凑两个瓶子来还债,所以这个代码错了吧,引以为戒。

但还是可以借鉴一下的。首先先设出变量,求其中存在的关系式,我设每次喝完后的总瓶数sum,每次喝完后汽水盖子的总数x,每次换完盖子后剩余的盖子y,所以第一次喝完后我们有20个盖子可以换,下一次就有20/2=10个盖子,再下一次就是5,但只有4个可以换,剩下一个就为y,所以x=x/2,y=y+x%2.而每次喝完总的瓶数sum情况如下表:


错误代码,注意

#include<stdio.h>
int main()
{
	int sum = 0;                             //总瓶数
	int x = 0;                                //每次喝完汽水后盖子总数
	int y = 0;                               //每次换完后剩余盖子数
	for (x = 20; x > 0; x = x / 2)
	{
		sum = sum + x + y;
		y = y + x % 2;
	}
	printf("%d",sum);
	return 0;
}


注意了,我来说一说正确的解决方法。

你每次喝的可乐瓶数等于前面喝的瓶数总和加上瓶盖总数的一半再加上模二之后的数

而你每次的瓶盖数就是以1/2倍递减

所以代码如下:

int drink_kola(int money)
{
	int cap_numble = money;
	int kola_numble = money;
	while (cap_numble > 1)
	{
		kola_numble = kola_numble + cap_numble / 2 + cap_numble % 2;
		cap_numble = cap_numble / 2;

	}
	return kola_numble;
}

测试代码

int main()
{
	int money = 0;
	int ret = 0;
	printf("please input money numble:");
	scanf("%d",&money);
	ret = drink_kola(money);
	printf("%d\n", ret);
	return 0;
}















  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值