【问题标题】:Adding up all combinations of number in an array将数组中数字的所有组合相加
【发布时间】:2012-08-18 15:51:59
【问题描述】:

我正在尝试用 javascript 编写一个程序,该程序从 html 文本区域中获取未指定数量的数字并尝试所有组合(将所有数字彼此相加)以查看它是否与您指定的数字相匹配。

现在我可以从 textarea 中的字符串创建一个数组,并使用 for 循环将它们添加起来(参见下面的代码)。问题是如何为要添加的未指定数量的数字执行此操作(例如,如果您在 textarea 中输入 7 个数字,则添加 7 个不同的数字)?我正在考虑使用第二个数组,它会从第一个循环中获取要加起来的数字。然后通过使用包含所有数字(在我的示例中为行)作为最终值的数组的长度的 for 循环来制作循环变量的长度。

如何填写第二个数组的值,确保使用所有组合?

顺便说一句,我想要这段代码是因为我是一名审计员。有时,客户在一次预订中撤销了几个金额,而没有任何评论。此代码将更容易检查哪些预订已被撤销

edit:cheeken 的 awnser 似乎在工作我只有一句话。如果您的电源组的多个子组相加会产生您正在寻找的数字怎么办?例如:findSum([1,2,3,4,5],6) 可以得出 [1,2,3],但也可以得出 [2,4] 或 [1,5]。是否可以让函数返回多个子集?

我自己找到了答案:) 我替换了代码

return numberSet;

document.getElementById("outp").value=document.getElementById("outp").value+ numberSet +"\n"; 

非常感谢奇肯

还有一个问题。如何格式化输入以解析该函数​​?下面的代码似乎不起作用。 inp 是输入所在的文本区域的 ID(数字用半列分隔。变量 ge 有效,所以那里没有问题(用 [1,2,3,4] 测试它并且有效。出了什么问题用这段代码?

重新编辑:

找到了解决方案。需要解析为浮点数的数组添加了这段代码。`

for (var i=0; i < lines.length; i++) {
    lines[i]= parseFloat(lines[i]);
    }


findSum(document.getElementById("inp").value.split(";"), ge);

代码:

<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
function powerset(arr) {
    var ps = [[]];
    for (var i=0; i < arr.length; i++) {
        for (var j = 0, len = ps.length; j < len; j++) {
            ps.push(ps[j].concat(arr[i]));
        }
    }
    return ps;
}

function sum(arr) {
    var total = 0;
    for (var i = 0; i < arr.length; i++)
        total += arr[i];
    return total
}

function findSum(numbers, targetSum) {
    var numberSets = powerset(numbers);
    for (var i=0; i < numberSets.length; i++) {
        var numberSet = numberSets[i]; 
        if (sum(numberSet) == targetSum)
            document.getElementById("outp").value=document.getElementById("outp").value+ numberSet +"\n"; 
    }
}

function main()
{

ge= document.getElementById("getal").value;
findSum([1,1,0.5,0.1,0.2,0.2], ge);


}


</script>
</head>
<body>

<input type="button" onclick="main()" value="tel" /><input type="text" id="getal" /><br>
input<br><textarea id="inp"  ></textarea><br>
output<br><textarea id="outp" ></textarea><br>
document.getElementById("inp").value.split(";")
</body>
</html>

【问题讨论】:

  • 家庭作业问题应标记为家庭作业。请编辑/更新您问题的标签。
  • 这不是家庭作业,如下所述。 ;)
  • 谁能给我解释一下它是怎么来的 document.getElementById("inp").value.split(";") cqn't be used as a parameter?我也尝试过定义数组 first://lines = [[]]; lines = document.getElementById("inp").value.split(",");// 使用行作为参数
  • 好的。我找到了我之前评论的答案。再次感谢奇肯的支持 :)

标签: javascript arrays


【解决方案1】:

更具体地说,您要在您的数字集合的power set 中查找每个集合的特定总和。

您可以使用以下代码完成此操作。

function powerset(arr) {
    var ps = [[]];
    for (var i=0; i < arr.length; i++) {
        for (var j = 0, len = ps.length; j < len; j++) {
            ps.push(ps[j].concat(arr[i]));
        }
    }
    return ps;
}

function sum(arr) {
    var total = 0;
    for (var i = 0; i < arr.length; i++)
        total += arr[i];
    return total
}

function findSum(numbers, targetSum) {
    var numberSets = powerset(numbers);
    for (var i=0; i < numberSets.length; i++) {
        var numberSet = numberSets[i]; 
        if (sum(numberSet) == targetSum)
            return numberSet;
    }
}

调用示例:

>> findSum([1,2,3,4,5],6)
[1, 2, 3]
>> findSum([1,2,3,4,5],0)
[]
>> findSum([1,2,3,4,5],11)
[1, 2, 3, 5]

如果您想收集总和为值的所有子集(而不是上面实现的第一个子集),您可以使用以下方法。

function findSums(numbers, targetSum) {
    var sumSets = [];
    var numberSets = powerset(numbers);
    for (var i=0; i < numberSets.length; i++) {
        var numberSet = numberSets[i]; 
        if (sum(numberSet) == targetSum)
            sumSets.push(numberSet);
    }
    return sumSets;
}

调用示例:

>> findSums([1,2,3,4,5],5);
[[2,3],[1,4],[5]]
>> findSums([1,2,3,4,5],0);
[[]]

【讨论】:

  • 感谢您的快速回复。我明天试试这个。顺便说一句,我想要这个代码,因为我是一名公共会计师。有时客户在一次预订中撤销了几个金额,没有任何评论。这样可以更轻松地查看哪些预订已被撤销。
  • 我试过你的代码。它似乎正在工作。我只有一个备注问题。如果您的功率集的多个子集相加会导致您正在寻找的数字,例如:findSum([1,2,3,4,5],6) 可能会导致 [1,2,3] 也可能是 [ 2,4] 或 [1,5]
  • @PieterjanVanDam 我已经修改了我的答案以解决您的问题。如果我的回答有用,请考虑支持或接受它。谢谢。
  • 迄今为止我在 2021 年找到的最佳解决方案 :-)
猜你喜欢
  • 1970-01-01
  • 2018-03-28
  • 1970-01-01
  • 1970-01-01
  • 2021-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多