我有一个公式显示如下,
((((c1+c2)/c3)*c4)-c5+c6)
此公式格式可以更改,这意味着此公式从最终用户生成。它可以是任何格式。我们只使用基本的算术运算符,即+
,-
,*
,/
和(
,)
。
我可以选择任何一个值来查找。如果我选择C3
来查找值,则需要修改公式,如下所示,
C3 = (c1+c2)*(c4/(c5-c6))
欢迎提出建议和想法。有没有可用的API?
答案 0 :(得分:2)
我想我会考虑从2个集合开始,一个表示方程式的左侧,另一个表示右侧。 RHS将从一个元素开始,即整个公式。然后,开始从外部工作中剥离括号。当每个元素被暴露时,将其添加到第二个集合,确保反转操作。然后,只要移动要搜索的元素,就开始从第二个集合移回第一个集合。
由于我真的认为这是作业,我不想给出代码答案,但我上面的胡言乱语转化为“逐步完成算术转换”。所以,要暴露C3:
((((c1+c2)/c3)*c4)-c5+c6)
(((c1+c2)/c3)*c4)-c5+c6
(c5 - c6) = (((c1+c2)/c3)*c4)
(c5 - c6) = ((c1+c2)/c3)*c4
((c5 - c6) / c4) = ((c1+c2)/c3)
((c5 - c6) / c4) = (c1+c2)/c3
(c3* ((c5- c6) / c4) = (c1 + c2)
c3* (c5- c6) = (c1 + c2) * c4
c3 = (((c1 + c2) * c4) / (c5 - c6))
我不完全确定我的错误在哪里,我的最终等式与你的不同,但我相信这是我将采取的方法 - 逐步完成每个转换,直到你需要的变量暴露出来。
答案 1 :(得分:1)
如果目标变量发生任意次数,则(通常)不可能导出公式。如果只出现一次,算法非常简单。首先将公式转换为反向抛光表示法。然后构建一个二叉树,它在叶子中有变量,在内部节点中有操作。 (当你有一个反向抛光表示法时,它非常简单,几乎就像表达式的计算一样,但是在堆栈上使用子树而不是数字。)处理从根到所需叶子的路径,求解最简单的方程式:
? + c6 = 0 ? = 0 - c6 ? - c5 = 0 - c6 ? = (0 - c6) + c5 ? * c4 = (0 - c6) + c5 ? = ((0 - c6) + c5) / c4 (c1+c2)/? = ((0 - c6) + c5) / c4 ? = (c1+c2) / (((0 - c6) + c5) / c4) c3 = (c1+c2) / (((0 - c6) + c5) / c4)
我在这里用?包含目标变量的子树。请注意,您需要解决的每个等式都是形式(...)op? =(...),因此以明显的方式解决。