algorithm - 5个数字等于23

标签 algorithm combinations pseudocode

如何检查给定的 5 个数字和数学运算(+、-、*)是否可以得到 23 的结果?

例如:

1 1 1 1 1 –– 不可能

1 2 3 4 5 –– 可能

规范:

所有操作都具有相同的优先级并从左到右执行(不是按照数学上正确的顺序)。

最佳答案

虽然您可以使用蛮力来尝试所有可能的组合,但我会建议一个稍微更优雅的解决方案:

最后一位和乘法是关键。如果结果 (23) 不能被最后一位数整除,则最后一个运算符不能是“*”。然后你可以尝试相同的结果 + - 最后一位数字,因为它被添加或减去。以这种方式向后迭代应该可以节省相当多的迭代次数。

伪代码示例:

var digits = [1, 2, 3, 4, 5];
var expected = 23;
var combinatoric =  function(digits, expected) {
    var result = false;
    var digit = digits[digits.length -1];
    var nDigits = digits.removeLast();
    // If we are at the last digit...
    if(nDigits.isEmpty() && Math.abs(digit) == Math.abs(expected)) {
        //Last digit must be added or substracted, as its the starting digit.
        result = true;
    } else if(!nDigits.isEmpty()) {
        //Only if divisible is "*" an option.
        if(expected % digit == 0) {
            if(combinatoric(nDigits, expected / digit) {
                result = true;
            }
        }
        // "+" and "-" are always options.
        if(combinatoric(nDigits, expected - digit) {
            result = true;
        }
        if(combinatoric(nDigits, expected + digit) {
            result = true;
        }
    }
    return result;
}

这种方法至少可以节省几次迭代,因为如果无论如何都无法解析为自然数,您就不会尝试乘法。通过倒退,您可以使此计算递归,因为修改后的预期结果会传递到每次迭代。

关于algorithm - 5个数字等于23,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48967460/

相关文章:

algorithm - (非压缩)Trie 的使用

ruby - 计算具有特定子集大小的集合分区

javascript - 如何计算不同数组之间的所有组合?

algorithm - 将线性递归函数重写为尾递归函数

algorithm - 变量 m 更新了多少次

algorithm - 给定 2d 中的一小组点,如何绘制在每个点周围不重叠的圆,以便它们的半径最大化?

javascript - 计算文本中的字母并生成带有结果的对象

c - C中递归函数枚举并返回二维数组n选k的所有组合

java - 构建有效求和为数字的排列

algorithm - 在伪代码中使用动态二维数组或 HashMap ?