汉扬编程 C语言入门 啤酒3块一瓶,7瓶盖2酒瓶可换一瓶酒,15块最多可以喝几瓶?

啤酒3块一瓶,7瓶盖2酒瓶可换一瓶酒,15块最多可以喝几瓶?

生活中常常遇到一些比较有趣的问题,有些是脑筋急转弯类的“软问题”,依靠清奇的脑回路才能解决。而有些则是正宗的“硬问题”,只有拥有缜密的逻辑思维能力的人才能解决。例如下面这个问题:

啤酒3块一瓶,7瓶盖2酒瓶可换一瓶酒,15块最多可以喝几瓶?

“喝啤酒问题”

啤酒3块一瓶,7瓶盖2酒瓶可换一瓶酒,15块最多可以喝几瓶?

啤酒3块钱一瓶,7个瓶盖或者2个空酒瓶可以换一瓶啤酒,小明有15块,最多可以喝几瓶啤酒?短小精悍的问题 这个问题在网上流传甚广,所以这里稍稍修改了一些参数,避免与BD上可以搜到的答案重复。我们不考虑小明的酒量,也不考虑小明和店老板关系好,可以赊账等情况,仅从数学角度考虑该问题。

啤酒3块一瓶,7瓶盖2酒瓶可换一瓶酒,15块最多可以喝几瓶?

这个问题虽然简短,但是挺“绕人”的:使用空酒瓶和瓶盖换啤酒时,空酒瓶和瓶盖的数目会减少,但是得到啤酒后,空酒瓶和瓶盖的数目又会增加。另外,小明还可以自己花钱买啤酒。空酒瓶、瓶盖、啤酒、钱各个组件彼此纠缠,如果没有清晰的头脑,很容易就迷糊了。

啤酒3块一瓶,7瓶盖2酒瓶可换一瓶酒,15块最多可以喝几瓶?

乐于挑战逻辑问题

啤酒3块一瓶,7瓶盖2酒瓶可换一瓶酒,15块最多可以喝几瓶?

不过,作为C语言程序员,对这类问题应该非常有兴趣,因为这类问题考察的是逻辑思维能力,而程序员普遍对自己的逻辑思维能力自信,也乐于挑战逻辑问题。解决问题后,一来可以增加自己的成就感,二来还可以锻炼自己解决问题的能力。

啤酒3块一瓶,7瓶盖2酒瓶可换一瓶酒,15块最多可以喝几瓶?

所以从C语言编程角度来看,该如何解决这个问题呢? 不少C语言初学者遇到这种实际应用题时不知道该如何下手,但其实使用C语言编程解决这类问题是即为简单的。应明白:编程语言也是一种语言,可以看作是一门外语,C语言程序员可以使用C语言与机器沟通,告诉机器需要解决的问题。这样一来,就可以让机器帮我们解决问题了。

啤酒3块一瓶,7瓶盖2酒瓶可换一瓶酒,15块最多可以喝几瓶?

使用C语言把问题“描述”给机器

啤酒3块一瓶,7瓶盖2酒瓶可换一瓶酒,15块最多可以喝几瓶?

所以,要编程解决这个问题很简单,只需要使用C语言把这个问题“描述”给机器就可以了。首先,我们先定义几个变量,相关C语言代码如下:

啤酒3块一瓶,7瓶盖2酒瓶可换一瓶酒,15块最多可以喝几瓶?

int money = 15;int price = 3;int beer = 0;int bottle = 0;int cap = 0; 上述变量描述了小明一开始的状态:拥有15块钱,一瓶啤酒的价格是3块钱,已经喝了 0 瓶啤酒,手里有 0 个空酒瓶和 0 个瓶盖。

然后我们定义一个函数,这个函数用来描述小明喝一瓶啤酒发生的事,请看下面的C语言代码:

int drink_one_beer(){ // 如果没喝到啤酒 return 0; //如果成功和到一瓶啤酒 return 1;} drink_one_beer() 函数表示小明尝试喝一瓶啤酒,显然只有两种情况:一种是喝到啤酒了,一种是没喝到,在C语言代码中,分别使用 return 1 和 return 0 来表示这两种情况。

现在设想小明喝到啤酒的情况:显然,喝到的啤酒数目多了一瓶,空酒瓶和瓶盖也会都多一个,使用C语言描述这一过程就是:

beer ++;cap ++;bottle ++; 再来想想小明和一瓶啤酒要付出的代价:也很明显,要么是花钱买,要么是用空酒瓶或者瓶盖换,只不过小明得确保自己的钱够用,或者空酒瓶、瓶盖的数目足够多。使用C语言描述这一过程,得到如下代码:

if(cap >= 7) cap -= 7;else if(bottle >= 2) bottle -= 2;else if(money >= price) money -= price;else // 喝不到啤酒了

小明喝一瓶啤酒的C语言描述

整理一下C语言代码,就可以得到小明喝一瓶啤酒的C语言描述了:

int drink_one_beer(){ if(cap >= 7) cap -= 7; else if(bottle >= 2) bottle -= 2; else if(money >= price) money -= price; else return 0; beer ++; cap ++; bottle ++; return 1;}drink_one_beer()函数

现在我们再编写 main() 函数,其实很简单,我们要告诉机器:只要小明能喝到啤酒,就让他一直喝。这一过程使用C语言来描述,就是:

int main(){ while(drink_one_beer()); return 0;} 最后,我们让机器将小明喝到的啤酒,空酒瓶以及瓶盖数目,剩余的钱打印出来给我们看一下就可以了,所以main()函数的C语言代码可以按照下面这样写:

nt main(){ while(drink_one_beer()); printf(\”\\n%d beer drunk, remains:\\n\\n\”, beer); printf(\” money:\\t%d\\n\”, money); printf(\” bottle:\\t%d\\n\”, bottle); printf(\” cap:\\t\\t%d\\n\”, cap); return 0;}main()函数的C语言代码

到这里,应该能够发现,使用C语言解决这个问题其实是非常简单的。现在编译这段C语言代码并执行,得到如下输出:

# gcc t2.c# ./a.out 11 beer drunk, remains: money: 0 bottle: 1 cap: 4小明可以喝 11 瓶啤酒

答案很明显了,小明可以喝 11 瓶啤酒,最后口袋里还剩 0 块钱,剩余 1 个空酒瓶和 4 个瓶盖。

小结 本节主要介绍了如何使用C语言解决网上流传甚广的“喝啤酒”问题。应明白,解决该问题的方法远不止一个,本文抛砖引玉,主要讨论的其实是一种“编程思维”,初学者可以使用本文介绍的“描述”法解决生产生活中的各类复杂问题。

点个赞再走吧

欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。

本文来自网络,不代表汉扬编程立场,转载请注明出处:http://www.hyzlch.com/cjia/6566.html

这些地名别说孩子了,您能读对几个?

leetcode1518_go_换酒问题

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

返回顶部