要点:
我有一组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”之间的所有操作以获得最终结果值。
这是实现目标的最佳方式吗?
EDIT-1:
例如,如果我有数字(1,2,3),那么我想做以下
1 + 2 + 3 = 6
1 + 2-3 = 0
1-2-3
1 * 2 * 3 = 6
等等。
基本上,这组数字之间的所有可能的算术运算。
答案 0 :(得分:1)
简短的回答就是NO。这不是最佳的。例如,您将计算(a + b)+ c和(a + c)+ b,但它们都具有相同的值。
答案 1 :(得分:0)
你的方法基本上是合理的,但不完整。首先,请注意在正常的算术规则下,您需要在输出中包含一些括号(表示分组,如[(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],除非你允许输入包括零。)你必须决定你想对它们做些什么。