啤酒3块一瓶,7瓶盖2酒瓶可换一瓶酒,15块最多可以喝几瓶?使用C语言解决

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

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

阅读更多:   杂谈 , C语言
添加新评论

icon_redface.gificon_idea.gificon_cool.gif2016kuk.gificon_mrgreen.gif2016shuai.gif2016tp.gif2016db.gif2016ch.gificon_razz.gif2016zj.gificon_sad.gificon_cry.gif2016zhh.gificon_question.gif2016jk.gif2016bs.gificon_lol.gif2016qiao.gificon_surprised.gif2016fendou.gif2016ll.gif