11

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

 3 years ago
source link: https://blog.popkx.com/beer-3-bottles-a-bottle-7-bottles-capped-2-bottles-can-be-replaced-by-a-bottle-of-wine-15-bottles-can-drink-up-to-several-bottle/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

发表于 2019-05-23 19:05:37   |   已被 访问: 294 次   |   分类于:   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;
}
70a7465b33b513bbc03bd45064d3c5a7.png

现在我们再编写 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;
}
6d02b8b771ed80134e7ac6829366e3b9.png

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

11 beer drunk, remains:

  money:    0
  bottle:   1
  cap:      4

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

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

阅读更多:   C语言 , 杂谈


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK