可以将2个整数之间的乘法简化为一系列加法运算,如下所示
3 * 5 = 3 + 3 + 3 + 3 + 3 = 5 + 5 + 5
求幂(将a增大到b)也可以简化为一系列乘法:
5 ^ 3 = 5 * 5 * 5
因此,可以通过创建乘法表达式将乘幂减少为一系列加法,然后减少为一系列加法。例如,5 ^ 3
(5立方)可以重写为
5 ^ 3 = 5 * 5 * 5
= (5 + 5 + 5 + 5 + 5) * 5
= (5 + 5 + 5 + 5 + 5) + (5 + 5 + 5 + 5 + 5) + (5 + 5 + 5 + 5 + 5) + (5 + 5 + 5 + 5 + 5) + (5 + 5 + 5 + 5 + 5)
= 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5
您的任务是,给定由加幂,乘法和加法组成的表达式,将其简化为最短的加法序列。“最短”表达式定义为+
符号数量最少的表达式,但仍仅使用原始表达式中两个数字之一。例如,的最短表达式10 * 2
是10 + 10
。
输入中涉及的数字均为正整数,表达式仅包含+
(加法),*
(乘)和^
(取幂)以及整数和方括号(()
)表示优先级组成。
输出应包含正整数和 +
符号。您不应该输出缩减的各个步骤,而仅输出最终输出。输出中可能没有输入中没有出现的任何数字。但是,您可以使用3个不同的符号代替+*^
,但请说出它们是什么符号
输入和输出之间的空格可能会或可能不会在您的程序中使用,即3 * 5
可以作为以下两者之一输出5 + 5 + 5
或5+5+5
。
请注意,在大多数情况下,实际上并不执行加法。唯一要执行加法的情况是5 ^ (1 + 2)
,在这种情况下,必须继续加法-> 5 ^ 3 -> 5 * 5 * 5 -> ...
。参见测试案例4。
您的代码无需处理到达歧义表达式的输入。例如,(2 + 2) * (4 + 1)
。由于到目前为止已制定了规则,因此目标不是计算答案,而是将目标简化为加法。因此,结果可能会有所不同,具体取决于表达式被解析或转换的顺序(哪些要简化,哪些要保留?)。另一个无效的示例:((3 + 2) ^ 2) ^ 3 -> ((3 + 2) * (3 + 2)) ^ 3 -> ???
。
这是代码高尔夫球,所以最短的代码胜出
测试用例
Input => output
5 ^ 3 + 4 * 1 ^ 5 => 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 4
2 ^ 1 * 2 + 3 + 9 => 2 + 2 + 3 + 9
2 ^ 1 * (2 + 3) + 9 => 2 + 3 + 2 + 3 + 9
2 ^ (1 * (2 + 3)) + 9 => 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 9
10 + 3 * 2 + 33 ^ 2 => 10 + 3 + 3 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33
100 * 3 => 100 + 100 + 100
2 ^ 1 + 2 ^ 1 + 2 ^ 2 + 8 ^ 1 => 2 + 2 + 2 + 2 + 8
(1 + 2 + 5 * 8 + 2 ^ 4) * 2 => 1 + 2 + 8 + 8 + 8 + 8 + 8 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 1 + 2 + 8 + 8 + 8 + 8 + 8 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2
using only one of the two numbers in the original expression.
但是原始表达式可以有两个以上的数字。我不明白为什么8 + 8
不是的有效输出2 ^ 1 + 2 ^ 1 + 2 ^ 2 + 8 ^ 1
。我仍然不清楚这个问题。
**
代替使用^
吗?