在 3 个数字之间进行所有可能的算术运算



摘要:

我有一组 3 个数字,比如说 (a,b,c(。我想在这些数字之间执行所有算术运算(+,-.*,/(并获取结果值。

我的想法是生成子集。

1] [(a,b(, c]

2] [(a,c(, b]

3] [(c,b(, a]

现在在集合 [(a,b(,c] 中,我将执行 "a" 和 "b" 之间的所有操作,将它们存储为 "r1","r2"、"r3"。等。完成后,我将执行"r1"、"r2"之间的所有操作...和"c"获得最终结果值。

这是实现目标的最佳方法吗?

编辑-1:

例如,如果我有数字(1,2,3(,那么我想执行以下操作

1+2+3 = 6

1+2-3 = 0

1-2-3

1*2*3 = 6

等等。

基本上,一组数字之间所有可能的算术运算。

简短的回答只是否定的。这不是最佳的。例如,您将计算 (a+b(+c 和 (a+c(+b,但它们具有相同的值。

你的方法基本上是合理的,但不完整。首先,请注意,在正常的算术规则下,您需要在输出中包含一些括号(以表示分组,例如 [(a+b(*c](,或者接受某些运算组合不会出现在最终输出中。

此外,您将根本无法生成某些其他算术运算组合,例如"1*(2+3("。(这假设您要将"1*(2+3("与"(2+3(*1"视为不同。从词汇上讲,它肯定是。为此,您还需要在子集中包括形式 [a, (b, c(] 的所有分组。如果包含第二组分组,则实质上将生成每个可能表达式的解析树。但是,这会产生其他人在注释中指出的复杂性:"1+(2+3("和"(1+2(+3"一旦删除多余的括号,它们就相同了。

如果你允许 a、b 和 c 中的两个(或全部三个(相等,还有另一个问题。(例如,如果 (a, b, c( = (1, 3, 3(,则"1+3+3"将出现两次,一次用于 [(a+b(+c],一次用于 [(a+c(+b]。如果允许像 [a,(b,c(] 这样的分组,那么一旦你去掉不必要的括号,它总共会出现四次。如果你想允许 a、b 和/或 c 之间相等,但又避免重复的输出,你需要在某个阶段消除重复

  • 生成所有输出并测试重复项(例如,通过简单的字符串比较(
  • 生成
  • 所有解析树并在那里测试重复项(与第一个没有太大区别,但避免了在丢弃之前生成最终输出的工作(
  • 在开始插入运算符的过程之前修剪子集的集合(可能是最好的(
  • 避免通过更复杂的生成方案生成重复的子集(我想不出我的头顶(

最后(我认为(,如果您允许第二组分组并且还允许 a、b 和 c 之间的重复,那么有些表达式例如"1/(3 - 3("无法计算。(我不认为这会出现分组[(a,b(,c],除非您允许输入包含零。你必须决定你想对它们做什么。

相关内容

最新更新