如何打印像24point这样的游戏计算过程?

时间:2013-07-15 09:26:10

标签: algorithm

这是问题所在: 给定4个数字,我需要给出一个计算过程,结果24.我可以使用的所有操作都是加法,减法,乘法,除法。如何打印计算过程? 例如: 输入:4,7,8,8 输出:(7-(8/8))* 4 = 24。

1 个答案:

答案 0 :(得分:1)

(以下是对Sayakiss提出的想法的扩展)

一个选项是枚举所有可能的数字组合和对它们执行的算术运算。

如果您有4个数字,则只有24种不同的方法可以在列表中编写它们(以下示例适用于数字4,7,8,9 - 我更改了示例中的最后一个数字,使它们全部不同) :

4 7 8 9
4 7 9 8
4 8 7 9
4 8 9 7
...
9 8 7 4

如果某些数字相同,则上述某些列表会出现两次(不是问题)。

对于上述每个排序,有64种不同的方法可以在数字之间插入算术运算:

4+7+8+9
4+7+8-9
4+7+8*9
4+7+8/9
4+7-8+9
...
4/7/8/9

对于上述每个序列,有5种方法可以放置括号:

((4-7)-8)-9
(4-7)-(8-9)
(4-(7-8))-9
4-((7-8)-9)
4-(7-(8-9))

当你结合上面提到的所有3个“方面”时,你得到24 * 64 * 5 = 7680个表达式;评估每个值并检查其值是否为24(或您需要的任何数字)。

以树形式生成表达式可能很方便,以简化评估(这取决于您要使用的编程语言;例如,在C / C ++中没有eval function)。例如,表达式4*((7-8)+9)可以由以下树表示:

  *
 / \
4   +
   / \
  -   9
 / \
7   8

一些注意事项:

  • 你可能想要调整算术运算的选择以允许像47+88这样的表达式 - 不确定你的游戏规则是否允许这样做。
  • 许多评估过的表达式可能会令人讨厌,例如((4+7)+8)+84+(7+(8+8))(它们也被检查两次,其中8的顺序被切换);您可以通过在算法中插入一些专用检查来防止这种情况。