新浪博客

大和尚与小和尚吃馒头的数学题

2009-02-28 18:24阅读:
  有朋友在留言板问了一个数学问题,希望采用计算机语言来描述,由于那边字数限制,所以就来这边回答,顺便将思路也写一下,毕竟计算机描述跟我们人算是完全两码事。
  题目是这样的:有100个和尚吃100个馒头,大和尚1人吃4个,小和尚4人吃1个,问有多少个大和尚和多少个小和尚?
  这道数学题目用计算机来做,可以有两种方法,一种是类似破解密码所用的穷举法,从1算到100,方法如下:
  假设大和尚为X人,小和尚为(100-X)人,其中X小于100,(100-X)能被4整除,那么有:
  X*4 + (100-X)/4 = 100,其中X<100,(100-X) mod 4 = 0。用VB语言来描述为:
Dim X As Long
For X = 1 To 100
If (100 - X) Mod 4 = 0 Then
If X * 4 + (100 - X) / 4 = 100 Then
MsgBox '小和尚有' & 100 - X & '人,大和尚有' & X & '人。'
Exit For
End If
br> End If
Next X
  上面代码的意思,是让计算机从假设大和尚为1开始,一直假设到100,直到符合条件为止。这里面包括两个判断,一个为小和尚人数是否是4的倍数,一个为是否满足题目要求。
  如果从解答来说,上面的代码已经能解决问题。但是,如果从代码质量来说,却不是最优的。因为有一个“4的倍数”这个条件。这个条件通过提炼可以建立另一条公式。
  我们不对人数进行假设,而是将4个小和尚编为一组。假设小和尚为N组,一组小和尚吃一个馒头,那么有:
  N + (100 - N * 4) * 4 = 100
  这样用VB语言来描述为:
Dim N As Long
For N = 1 To 25
If N + (100 - N * 4) * 4 = 100 Then
MsgBox '小和尚有' & N * 4 & '人,大和尚有' & 100 - N * 4 & '人。'
Exit For
End If
Next N

  这样的代码,明显比上面一段要简单、优秀,而且更加接近数学解题方式。
  当然,一道题目,有很多的解题思路,这里只用两个例子来说明,即使是同一个结果,也是有不同的编程实现。用最有效的代码来达到目的,这个我们称之为“代码优化”。
  或者你说,为什么不再将 N + (100 - N * 4) * 4 = 100 简化一下,写为 15N=300 ,呵呵,这样你不如干脆写出 N=20 好了,根本就不用算了。这就是计算机解题的魅力所在——计算1亿次(或者更多)跟计算1次的时间差别,可以忽略不计。
 (文章最早发表于 www.pigmo.cn

我的更多文章

下载客户端阅读体验更佳

APP专享