生活中常常遇到一些比较有趣的问题,有些是脑筋急转弯类的“软问题”,依靠清奇的脑回路才能解决。而有些则是正宗的“硬问题”,只有拥有缜密的逻辑思维能力的人才能解决。例如下面这个问题:
啤酒3块钱一瓶,7个瓶盖或者2个空酒瓶可以换一瓶啤酒,小明有15块,最多可以喝几瓶啤酒?
短小精悍的问题
这个问题在网上流传甚广,所以这里稍稍修改了一些参数,避免与BD上可以搜到的答案重复。我们不考虑小明的酒量,也不考虑小明和店老板关系好,可以赊账等情况,仅从数学角度考虑该问题。
这个问题虽然简短,但是挺“绕人”的:使用空酒瓶和瓶盖换啤酒时,空酒瓶和瓶盖的数目会减少,但是得到啤酒后,空酒瓶和瓶盖的数目又会增加。另外,小明还可以自己花钱买啤酒。空酒瓶、瓶盖、啤酒、钱各个组件彼此纠缠,如果没有清晰的头脑,很容易就迷糊了。
不过,作为C语言程序员,对这类问题应该非常有兴趣,因为这类问题考察的是逻辑思维能力,而程序员普遍对自己的逻辑思维能力自信,也乐于挑战逻辑问题。解决问题后,一来可以增加自己的成就感,二来还可以锻炼自己解决问题的能力。
所以从C语言编程角度来看,该如何解决这个问题呢?
不少C语言初学者遇到这种实际应用题时不知道该如何下手,但其实使用C语言编程解决这类问题是即为简单的。应明白:编程语言也是一种语言,可以看作是一门外语,C语言程序员可以使用C语言与机器沟通,告诉机器需要解决的问题。这样一来,就可以让机器帮我们解决问题了。
所以,要编程解决这个问题很简单,只需要使用C语言把这个问题“描述”给机器就可以了。首先,我们先定义几个变量,相关C语言代码如下:
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语言描述了:
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;
}
现在我们再编写 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;
}
到这里,应该能够发现,使用C语言解决这个问题其实是非常简单的。现在编译这段C语言代码并执行,得到如下输出:
# gcc t2.c
# ./a.out
11 beer drunk, remains:
money: 0
bottle: 1
cap: 4
答案很明显了,小明可以喝 11 瓶啤酒,最后口袋里还剩 0 块钱,剩余 1 个空酒瓶和 4 个瓶盖。
小结
本节主要介绍了如何使用C语言解决网上流传甚广的“喝啤酒”问题。应明白,解决该问题的方法远不止一个,本文抛砖引玉,主要讨论的其实是一种“编程思维”,初学者可以使用本文介绍的“描述”法解决生产生活中的各类复杂问题。