0

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

4

1 回答 1

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 函数)。例如,表达式4*((7-8)+9)可以由以下树表示:

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

一些注意事项:

  • 您可能需要调整算术运算的选择以允许诸如47+88- 不确定您的游戏规则是否允许这样的表达式。
  • 许多计算的表达式可能非常冗长,例如((4+7)+8)+8and 4+(7+(8+8))(也检查了两次,以 8 的顺序切换);您可以通过在算法中插入一些专用检查来防止这种情况。
于 2013-07-15T12:45:06.007 回答