趣味数学编程题解之2008奥运智力填空
IT商界
数字可以用自身的规律来解决问题,非数字的东东也可利用数字的规律。有了规律,我们的工作就轻松了,有了规律,我们就可以轻松地给计算机下命令了……
同样是填空游戏,本期的题目和27期的《怎样组合最大》像是哥俩,本期是另一种类的填空游戏,不是填数字,而成了填运算符号。
题目:2008奥运智力填空
(34□5□6□8□9□1)□2=2008
方框中可填入+,-或×号三者中的一种。如何解决这个问题呢?对于我们来说,最好的办法是突发灵感,一写就有了;最差的办法是一种种地向上凑,因为每个小方格可选三种符号,故有729种可能,更糟的是我们选择了728种情况后还是没做出来!
计算机做这种题目可是最拿手的了,用电脑如何将该题做出来呢?
实现原理
1.如何遍历729种方案
计算机的做法也是将729种情况每种都试试,看能不能有一种或几种符合条件。这就要遍历729种情况。
既然是遍历,自然要用到循环,可是在我们题目中要循环的不是数字而是算术运算符号,如果直接循环显然是行不通的,通过+,-和×号的ASCII码值来完成循环也不太好办,它们是42、43、45,中间有空位,规律不一。那通过什么方法呢?通过数组来完成比较好。
通过下面的数组把“+”号赋给mathchar(1)、“-”号赋给mathchar(2)、“*”号赋给mathchar(3),3个运算符号的规律就变成了数组mathchar()。
这样通过数组的下标1、2、3,便可简单地实现循环。因为是6个互不相关的空格,所以表达式的实现要通过6个嵌套的循环语句来实现。最终形成了一个字符串,这个字符串即等式左边表达式的字符形式,后面我们可直接利用它来完成计算。
2.判断某一方案是否符合条件(=2008)
在(1)中形成的每一个表达式(在题中是S)是一个字符形的变量,S是不能直接被利用的,通过它来计算,只能利用本身的特点,一步步地将S中包含的值和符号按算术符号的运算规律拆开完成计算。
计算时遵循如下原则:
(1)有括号先算括号;
(2)先算*乘法;
(3)再算+和-减法。
在本题编程过程中,我们先确定括号的位置,则按如下步骤:
(1)在括号内先找到级别最高的运算符*,如果没有则执行2,如果有,则按从左到右的次序依次算第一个*法,取得*左边的数和*右边的数,并将它运算得到新的值,再将得到的值取代其原先表达式字符形成新的字符串S,继续重复上述步骤,直至所有*号运算完毕。
(2)按从左到右次序依次取得运算符(+或-),并计算其值,以新值取代原先的表达式。
(3)执行3种与最后一个数有关的运算(+,-或*)
(4)将最后一次运算得到的结果同2008比较,如果相等,则输出初始的S,即我们的所求。
在题中通过子程序calcustr()实现上述过程,在程序中,我们也将四部分做了标注。
语言、界面、源程序
1.语言
程序通过Virual BASIC6.0语言来实现。
2.界面
进入VB,建立一个标准EXE工程,在窗体上放什么东东呢?其实需要不是很多,只需输出将来的结果,所以最好是一个文本框(TextBox),将名称改为TxtOutput。因为方案可能有多种,所以文本框还要设成多行的形式(MultiLine属性设为True)。为了能比较好地控制程序的运行,设一命令按钮(CommandButton)并将Name改为“cmdSearch”,Caption改为“查找”。然后在窗体上放入一标签LABEL,并将Caption设为我们上面的公式。为了便于退出,再设一命令按钮负责退出,其Name为CmdExit。
3.源程序
下载地址:http://www.cpcw.com/download/soft/30/30-b13.txt
关于调试
1.所有方案是否全部遍历
可在循环的最里面放入一个计数变量来完成计数,也可在内侧放入输出语句,使每次的字符组合都能看到,可以观察得到的结果和期望是否相同。
2.判断是否符合要求,错在哪一步
从计算的过程我们不难看到,在计算过程中是通过一级一级运算符来计算,在同一级别内,通过一个一个运算符进行计算,得到新的字符串再重新执行上述过程,直到最后得到一个数字,也就是到没有运算符为止。所以调试过程中不同级别,同一级中不同位置运算符所得的结果十分重要,我们可在calcustr()子程序中相应的部分设上输出语句或通过设置断电来查看可能出错的原因。
3.将二者合并时出现的问题
在子程序和循环综合调试中,可能出现由于变量名相同而引起的混乱,所以应该对每个变量的作用域重新审视,程序中f是出现问题的一个变量,原先将它放在子程序处进行声明,结果导致出现死循环,所以使用过程中应慎重。
小结
结果挺简单的:(34*5*6-8-9+1)*2=2008
1.数组是为规律而生的
数组是一种非常好的规律工具,对数值尤其如此。因为数组是一个数的组织,将数组织起来,可以让人们充分发挥自己的想象,去找出隐藏在内部的联系。
2.规律要善于发现
其实规律就蕴藏在众多的数值之中,如果实在找不出,就把它们组织成数组,数值可利用数组的这种规律,非数值数据也可利用,我们要善于发现,还要善于把数组创造出规律。大胆地发现,有时免不了在没有任何定律的前提下进行猜测。